web-dev-qa-db-fra.com

Comment faire en sorte que les graphes matplotlib aient l’aspect professionnel?

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:

enter image description here

Ci-dessous, l'apparence que je cherche, qui est bien loin d'en haut:

enter image description here

Notez la gentillesse suivante dans le 2ème exemple:

  1. La zone située sous le graphique est remplie d'une couleur beaucoup plus agréable à l'œil.
  2. La ligne du graphique est penseuse et se détache bien.
  3. Les lignes des axes sont penseuses et ressortent joliment.
  4. L'aire sous la courbe est transparente.
  5. Les graduations de l'axe X sont plus denses.

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!

12
Shital Shah

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:  

  • Il n'y a pas de commande ou de paquet magique unique qui créerait de belles parcelles avec matplotlib

Bonne nouvelle:

  • Il existe des moyens simples pour modifier les paramètres par défaut, voir: http://matplotlib.org/users/customizing.html
  • Le modèle d'objet permet à l'utilisateur de tout changer et d'introduire de nouvelles fonctionnalités complexes.
  • Le code source est disponible, et même il peut être changé assez facilement par l'utilisateur.

À 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:

enter image description here

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:

  • rendre le remplissage transparent et de couleur moins offensive
  • rendre la ligne plus épaisse
  • changer la couleur du trait
  • ajouter plus de ticks sur l'axe X
  • changer les polices des titres

# 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:

enter image description here

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.

16
DrV

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)

enter image description here

Vous trouverez plus d’informations sur les styles d’origine marine dans la docs .

6
mwaskom

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()

enter image description here

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. 

2
Greg

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()
1
afternone