2014-07-03 13 views
10

I grafici matplotlib predefiniti appaiono davvero poco attraenti e persino poco professionali. Ho provato un paio di pacchetti tra cui seaborn e prettyplotlib, ma entrambi migliorano appena gli stili.Come far apparire i grafici matplotlib in modo professionale come questo?

Finora ho ottenuto a seguito utilizzando il pacchetto Seaborn:

enter image description here

seguito è l'aspetto che sto cercando, che è ben lungi dal sopra:

enter image description here

Notare la seguente gentilezza nel 2 ° esempio:

  1. L'area sotto il grafico è riempita con un colore molto più gradevole agli occhi.
  2. La linea del grafico è pensante e si distingue nettamente.
  3. Le linee dell'asse sono pensanti e di nuovo risalgono piacevolmente.
  4. L'area sotto la curva è trasparente.
  5. I segni di graduazione dell'asse X sono più densi.

Le mie domande sono: riconosci sopra come una sorta di tema o stile popolare che posso utilizzare rapidamente in matplotlib? O se posso usare da qualche pacchetto? In caso contrario, è comunque necessario impostare questo stile come preferenza globale? In caso contrario, è possibile farlo anche in matlibplot?

Grazie!

+7

Non direi quello inferiore professionalmente fatto. Sembra qualcosa uscito da excel. – tacaswell

risposta

15

Questa è davvero una questione di gusti, e anche una questione di pubblico di destinazione. matplotlib prova a produrre illustrazioni chiare per scopi scientifici. Questo è - necessariamente - un compromesso e le illustrazioni non sono qualcosa che dovresti stampare su una rivista o mostrare in una pubblicità.

Ci sono alcune buone notizie e alcune cattive notizie su matplotlib in questo senso.

Cattive notizie:

  • Non esiste un unico comando di magico o di un pacchetto che creerebbe belle trame con matplotlib.

Buone notizie:

  • ci sono modi semplici per cambiare le impostazioni di default, vedi: http://matplotlib.org/users/customizing.html
  • Il modello di oggetti consente all'utente di cambiare quasi tutto e introdurre nuove funzionalità complesse.
  • Il codice sorgente è disponibile e persino può essere modificato facilmente dall'utente.

Secondo me la cosa più difficile è decidere quello che vuoi. Quindi fare quello che vuoi è più facile, anche se all'inizio c'è una curva di apprendimento molto ripida.

A titolo di esempio:

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

(Solo un commento: I limiti di asse X nell'immagine originale non prendono la ciclicità dei dati in considerazione.)

Questo ci darà qualcosa di simile:

enter image description here

E 'facile capire che abbiamo bisogno di fare un sacco di modifiche al fine di essere in grado di mostrare questo a un pubblico meno ingegneristico. Almeno:

  • rendere il riempimento offensive trasparente e meno colore
  • rendono la linea più spessa
  • cambiare il colore della linea
  • aggiungere altre zecche all'asse X
  • cambiamento fonti del titoli

# 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') 

Ora abbiamo:

enter image description here

Questo non è esattamente come nella questione, ma tutto può essere sintonizzato verso quella direzione. Molte delle cose impostate qui possono essere impostate come predefinite per matplotlib. Forse questo dà un'idea di come cambiare le cose nelle trame.

+0

Grazie. C'è un modo per rendere il bordo superiore e destro della scatola grigiastro come nell'esempio? – ShitalShah

+1

@ShitalShah: Eccolo, guarda il codice. La parola chiave è "colonna vertebrale" (che può essere un po 'difficile da indovinare). – DrV

2

matplotlib è quasi infinitamente flessibile in modo da poter fare quasi tutto con esso e se non esiste è possibile scrivere da soli! Ovviamente le impostazioni predefinite sono insignificanti, questo perché ognuno ha la propria idea di ciò che è "bello", quindi è inutile imporre uno stile predefinito.

Ecco un esempio molto semplice che indirizza 4 dei tuoi punti.

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

Se la vostra voglia di impostare i valori predefiniti in modo che tutti i vostri diagrammi lo stesso aspetto, allora si dovrebbe generare una consuetudine matplotlibrc file. Un utile guide is here. Per visualizzare un elenco di tutte le opzioni disponibili basta chiamare il print plt.rcParams da un terminale interattivo.

Alcune delle altre funzionalità come il riempimento devono essere eseguite su base di trama. Puoi standardizzare questo attraverso il tuo lavoro creando una funzione che aggiunge il riempimento tra determinati dati come l'istanza dell'asse e i dati.

6

Per avvicinarti allo stile che preferisci, puoi utilizzare lo stile whitegrid in Seaborn. Come indicato nelle altre risposte, si controlla la trasparenza del riempimento con il parametro alpha su 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

ulteriori informazioni sugli stili Seaborn può essere trovato nel docs.

1

È possibile personalizzare lo stile trame come segue:

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