2012-10-24 33 views
18

tôi đang tìm cách để giảm mật độ của các nhãn đánh dấu trên khác nhau âm mưu phụmatplotlib: làm thế nào để giảm mật độ của nhãn tick trong subplots?

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

mà kết quả trong enter image description here

Tôi muốn giảm nhãn đánh dấu vào hai ô phụ trên. Làm thế nào để làm điều đó ? Cảm ơn.

Phần thưởng: 1) cách loại bỏ đường chấm chấm trên y = 0 tại cơ sở của các thanh? 2) cách loại bỏ nhãn x-trick giữa subplot 0 và 1? 3) cách đặt mặt sau của ô thành độ trong suốt? (xem dòng trục y bị hỏng ở dưới cùng bên phải phía sau mặt sau của ô)

Trả lời

15

Bạn có thể đặt các dấu tích đến nơi bạn muốn giống như bạn đặt xticks.

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

Điều này sẽ tạo bốn dấu chẵn nhau khoảng cách đều nhau cho đoạn con ax0 của bạn. Bạn có thể làm một cái gì đó tương tự cho các subplots khác của bạn.

31

Một cải tiến so với cách tiếp cận đề nghị bởi Aman như sau:

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

Hope this helps.

+0

Điều này giúp giảm số lượng bọ ve, nhưng bây giờ tôi có ba bọ ve đầu tiên thay vì bọ ve ở vị trí chính xác. –

+2

Dường như đối tượng MaxNLocator chỉ có thể được sử dụng cho một trục đơn. Nếu bạn sử dụng lại bộ định vị cho nhiều hơn một trục với các dấu khác nhau, các dấu tick cuối cùng sẽ được sử dụng cho tất cả các trục. – Mike

31

Một cách tiếp cận chung là nói Matplotlib số mong muốn của ve:

plt.locator_params(nbins=10) 

Sửa bởi ý kiến ​​từ @Daniel điện: để thay đổi cho một trục duy nhất (ví dụ 'x') trên một trục, sử dụng:

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

Đây phải là câu trả lời được chấp nhận –

+1

để thay đổi cho một trục (ví dụ x) trên trục, sử dụng: ax.locator_params (nbins = 10, axis = 'x') –

+0

Tôi nhận được 'TypeError: set_params() một đối số từ khóa bất ngờ 'nbins'' bất kỳ ý tưởng gì là sai với nó? – durbachit

Các vấn đề liên quan