2012-10-24 17 views
18

Sto cercando di diminuire la densità delle etichette delle tacche sulle diverse sottotramamatplotlib: come ridurre la densità delle etichette delle tacche nelle sottotrame?

import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
from StringIO import StringIO 
data = """\ 
    a b c d 
z 54.65 6.27 19.53 4.54 
w -1.27 4.41 11.74 3.06 
d 5.51 3.39 22.98 2.29 
t 76284.53 -0.20 28394.93 0.28 
""" 
df = pd.read_csv(StringIO(data), sep='\s+') 
gs = gridspec.GridSpec(3, 1,height_ratios=[1,1,4]) 
ax0 = plt.subplot(gs[0]) 
ax1 = plt.subplot(gs[1]) 
ax2 = plt.subplot(gs[2]) 
df.plot(kind='bar', ax=ax0,color=('Blue','DeepSkyBlue','Red','DarkOrange')) 
df.plot(kind='bar', ax=ax1,color=('Blue','DeepSkyBlue','Red','DarkOrange')) 
df.plot(kind='bar', ax=ax2,color=('Blue','DeepSkyBlue','Red','DarkOrange'),rot=45) 
ax0.set_ylim(69998, 78000) 
ax1.set_ylim(19998, 29998) 
ax2.set_ylim(-2, 28) 
ax0.legend().set_visible(False) 
ax1.legend().set_visible(False) 
ax2.legend().set_visible(False) 
ax0.spines['bottom'].set_visible(False) 
ax1.spines['bottom'].set_visible(False) 
ax1.spines['top'].set_visible(False) 
ax2.spines['top'].set_visible(False) 
ax0.xaxis.set_ticks_position('none') 
ax1.xaxis.set_ticks_position('none') 
ax0.xaxis.set_label_position('top') 
ax1.xaxis.set_label_position('top') 
ax0.tick_params(labeltop='off') 
ax1.tick_params(labeltop='off', pad=15) 
ax2.tick_params(pad=15) 
ax2.xaxis.tick_bottom() 
d = .015 
kwargs = dict(transform=ax0.transAxes, color='k', clip_on=False) 
ax0.plot((-d,+d),(-d,+d), **kwargs) 
ax0.plot((1-d,1+d),(-d,+d), **kwargs) 
kwargs.update(transform=ax1.transAxes) 
ax1.plot((-d,+d),(1-d,1+d), **kwargs) 
ax1.plot((1-d,1+d),(1-d,1+d), **kwargs) 
ax1.plot((-d,+d),(-d,+d), **kwargs) 
ax1.plot((1-d,1+d),(-d,+d), **kwargs) 
kwargs.update(transform=ax2.transAxes) 
ax1.plot((-d,+d),(1-d/4,1+d/4), **kwargs) 
ax1.plot((1-d,1+d),(1-d/4,1+d/4), **kwargs) 
plt.show() 

che si traduce in enter image description here

vorrei diminuire etichette delle tacche nelle due sottotrame superiori. Come farlo ? Grazie.

Bonus: 1) come sbarazzarsi della linea tratteggiata su y = 0 alla base delle barre? 2) come sbarazzarsi dell'etichetta x-trick tra sottotrama 0 e 1? 3) come impostare il retro del grafico in trasparenza? (vedere la linea dell'asse y rotta in basso a destra che scompare dietro il retro della trama)

risposta

15

È possibile impostare i segni di graduazione sul punto desiderato proprio come si imposta gli xticks.

import numpy as np 
ax0.yaxis.set_ticks(np.arange(70000,80000,2500)) 

Questo creerà quattro tick in modo uniforme per la sottotrama ax0. Puoi fare qualcosa di simile per le tue altre sottotrame.

31

Un miglioramento rispetto al suggerimento approccio Aman è il seguente:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 

# ... plot some things ... 

# Find at most 101 ticks on the y-axis at 'nice' locations 
max_yticks = 100 
yloc = plt.MaxNLocator(max_yticks) 
ax.yaxis.set_major_locator(yloc) 

plt.show() 

Spero che questo aiuti.

+0

Questo ha aiutato a ridurre il numero di zecche, ma ora ho i primi tre tick anziché i tick nella posizione corretta. –

+2

Sembra che un oggetto MaxNLocator possa essere utilizzato solo per un singolo asse. Se si riutilizza il localizzatore per più di un asse con tick diversi, i tick finali verranno utilizzati per tutti gli assi. – Mike

31

Un orientamento generale è quello di raccontare matplotlib il numero desiderato di zecche:

plt.locator_params(nbins=10) 

Edit dai commenti @ Daniel Potenza: cambiare per un singolo asse (ad es 'x') su un asse, l'uso:

ax.locator_params(nbins=10, axis='x') 
+7

Questa dovrebbe essere la risposta accettata –

+1

da modificare per un asse singolo (ad esempio x) su un asse, utilizzare: ax.locator_params (nbins = 10, axis = 'x') –

+0

Mi viene visualizzato un errore di tipo: set_params() ottenuto un argomento di parole chiave inaspettato 'nbins'a qualche idea di cosa c'è di sbagliato in esso? – durbachit

Problemi correlati