2012-10-24 16 views
18

szukam, aby zmniejszyć gęstość etykiet kleszczy na różniące subplotmatplotlib: jak zmniejszyć gęstość znaczników w podpotach?

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

co powoduje enter image description here

chciałbym zmniejszyć etykiety zaznaczyć w dwóch górnych wątków. Jak to zrobić ? Dzięki.

Bonus: 1) jak pozbyć się przerywanej linii na y = 0 na podstawie słupków? 2) jak pozbyć się etykiety x-trick między subplot 0 i 1? 3) jak ustawić tył działki na przezroczystość? (zobacz prawą dolną linię osi y zerwaną, która znika za tyłem działki)

Odpowiedz

15

Możesz ustawić zaznaczenia tak, jak chcesz, tak jak ustawiłeś xticks.

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

Spowoduje to utworzenie czterech tyknięć rozmieszczonych równomiernie na twoim podplocie ax0. Możesz zrobić coś podobnego dla swoich innych wątków.

31

Poprawa nad sugestią podejście Aman jest następujący:

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

nadzieję, że to pomaga.

+0

Pomogło to zmniejszyć liczbę kleszczy, ale teraz mam trzy pierwsze tiki, a nie kleszcze w prawidłowej lokalizacji. –

+2

Wygląda na to, że obiekt MaxNLocator może być używany tylko dla pojedynczej osi. Jeśli ponownie użyjesz lokalizatora dla więcej niż jednej osi z różnymi tikami, ostatnie tiki będą używane dla wszystkich osi. – Mike

31

Podejście ogólne jest powiedzieć matplotlib żądaną liczbę kleszczy:

plt.locator_params(nbins=10) 

Edycja Za komentarzy @Daniel Wydajność zmienić dla pojedynczej osi (np 'x') na osi, zastosowanie:

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

To powinno być zaakceptowaną odpowiedzią –

+1

na zmianę dla pojedynczej osi (np. X) na osi, użyj: ax.locator_params (nbins = 10, axis = 'x') –

+0

Otrzymuję komunikat 'TypeError: set_params() nieoczekiwany argument słowa kluczowego "nbins" ma pojęcie, co jest z nim nie tak? – durbachit

Powiązane problemy