Les graphes par défaut de matplotlib semblent vraiment peu attrayants et même peu professionnels. J'ai essayé quelques paquets qui incluent seaborn et prettyplotlib mais ces deux améliorations améliorent à peine les styles.
Jusqu'ici, je suis arrivé à suivre en utilisant le paquet Seaborn:
Ci-dessous, l'apparence que je cherche, qui est bien loin d'en haut:
Notez la gentillesse suivante dans le 2ème exemple:
Mes questions sont les suivantes: Reconnaissez-vous ci-dessus un thème ou un style populaire que je peux rapidement utiliser dans matplotlib? Ou si je peux utiliser un paquet? À défaut, est-il possible de définir ce style comme préférence globale? À défaut, est-il même possible de le faire dans matlibplot?
Merci!
C'est vraiment une question de goût, mais aussi une question de public cible. matplotlib
essaie de produire des illustrations claires à des fins scientifiques. Ceci est - nécessairement - un compromis et les illustrations ne sont pas quelque chose que vous imprimeriez dans un magazine ou dans une publicité.
Il y a de bonnes et de mauvaises nouvelles concernant matplotlib
dans ce sens.
Mauvaise nouvelle:
matplotlib
. Bonne nouvelle:
À mon avis, le plus difficile est de décider ce que vous voulez. Il est alors plus facile de faire ce que vous voulez, même s’il ya une courbe d’apprentissage raide au début.
Juste à titre d'exemple:
import numpy as np
import matplotlib.pyplot as plt
# create some fictive access data by hour
xdata = np.arange(25)
ydata = np.random.randint(10, 20, 25)
ydata[24] = ydata[0]
# let us make a simple graph
fig = plt.figure(figsize=[7,5])
ax = plt.subplot(111)
l = ax.fill_between(xdata, ydata)
# set the basic properties
ax.set_xlabel('Time of posting (US EST)')
ax.set_ylabel('Percentage of Frontpaged Submissions')
ax.set_title('Likelihood of Reaching the Frontpage')
# set the limits
ax.set_xlim(0, 24)
ax.set_ylim(6, 24)
# set the grid on
ax.grid('on')
(Juste un commentaire: les limites de l'axe des X dans l'image d'origine ne tiennent pas compte de la cyclicité des données.)
Cela nous donnera quelque chose comme ça:
Il est facile de comprendre que nous devons faire beaucoup de changements pour pouvoir montrer cela à un public moins soucieux de l’ingénierie. Au moins:
# change the fill into a blueish color with opacity .3
l.set_facecolors([[.5,.5,.8,.3]])
# change the Edge color (bluish and transparentish) and thickness
l.set_edgecolors([[0, 0, .5, .3]])
l.set_linewidths([3])
# add more ticks
ax.set_xticks(np.arange(25))
# remove tick marks
ax.xaxis.set_tick_params(size=0)
ax.yaxis.set_tick_params(size=0)
# change the color of the top and right spines to opaque gray
ax.spines['right'].set_color((.8,.8,.8))
ax.spines['top'].set_color((.8,.8,.8))
# Tweak the axis labels
xlab = ax.xaxis.get_label()
ylab = ax.yaxis.get_label()
xlab.set_style('italic')
xlab.set_size(10)
ylab.set_style('italic')
ylab.set_size(10)
# Tweak the title
ttl = ax.title
ttl.set_weight('bold')
Maintenant nous avons:
Ce n'est pas exactement comme dans la question, mais tout peut être réglé dans cette direction. Plusieurs éléments définis ici peuvent être définis par défaut pour matplotlib
. Cela donne peut-être une idée de la façon de changer les choses dans les parcelles.
Pour vous rapprocher du style que vous préférez, vous pouvez utiliser le style whitegrid
dans seaborn. Comme les autres réponses l'ont noté, vous contrôlez la transparence du remplissage avec le paramètre alpha
sur fill_between
.
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style("whitegrid")
blue, = sns.color_palette("muted", 1)
x = np.arange(23)
y = np.random.randint(8, 20, 23)
fig, ax = plt.subplots()
ax.plot(x, y, color=blue, lw=3)
ax.fill_between(x, 0, y, alpha=.3)
ax.set(xlim=(0, len(x) - 1), ylim=(0, None), xticks=x)
Vous trouverez plus d’informations sur les styles d’origine marine dans la docs .
matplotlib
est presque infiniment flexible, vous pouvez donc presque tout faire avec. Sinon, vous pouvez l'écrire vous-même! Évidemment, les valeurs par défaut sont fades, car tout le monde a sa propre idée de ce qui est "Nice", il est donc inutile d’imposer un style prédéfini.
Voici un exemple très simple qui aborde 4 de vos points.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
x = np.linspace(-10, 10, 1000)
y = 1+np.sinc(x)
ax = plt.subplot(111)
ax.plot(x, y, lw=2)
ax.fill_between(x, 0, y, alpha=0.2)
ax.grid()
majorLocator = MultipleLocator(1)
ax.xaxis.set_major_locator(majorLocator)
plt.show()
Si vous souhaitez définir les valeurs par défaut de sorte que tous vos graphiques aient la même apparence, vous devez générer un matplotlibrc file
personnalisé. Un guide utile est ici . Pour afficher la liste de toutes les options disponibles, appelez simplement print plt.rcParams
à partir d'un terminal interactif.
Certaines des autres fonctionnalités telles que le remplissage devront être effectuées parcelle par parcelle. Vous pouvez normaliser cela dans votre travail en créant une fonction qui ajoute le remplissage entre certaines entrées, telles que l'instance de l'axe et les données.
Vous pouvez personnaliser le style des parcelles comme suit:
import numpy as np
import matplotlib.pyplot as plt
plt.use_style('ggplot') # customize your plots style
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
plt.fill_between(x,y)
plt.show()