2011-07-04 19 views
11

Tôi đang cố gắng để tạo ra một cốt truyện nhưng tôi chỉ muốn ticklabels để hiển thị như thể hiện nơi quy mô đăng nhập được hiển thị như ở trên. Tôi chỉ muốn đánh dấu nhỏ cho 50, 500 và 2000 để hiển thị. Có anyway để xác định các nhãn tick nhỏ để hiển thị ?? Tôi đã cố gắng tìm ra điều này một chút nhưng không tìm được giải pháp tốt. Tất cả những gì tôi có thể nghĩ là lấy các minorticklabels() và thiết lập phông chữ thành 0. Điều này được hiển thị bên dưới đoạn mã đầu tiên. Tôi đã hy vọng có một giải pháp sạch hơn.Matplotlib vì vậy trục nhật ký chỉ có nhãn đánh dấu nhỏ tại các điểm được chỉ định. Ngoài ra thay đổi kích thước của nhãn tick trong colorbar

Điều khác đang thay đổi kích thước của các dấu ticklabels trong thanh màu mà tôi chưa tìm ra. Nếu có ai biết cách để làm điều này xin vui lòng cho tôi biết vì tôi không nhìn thấy một phương pháp trong colorbar dễ dàng làm điều này.

mã đầu tiên:

fig = figure(figto) 
ax = fig.add_subplot(111) 
actShape = activationTrace.shape 
semitones = arange(actShape[1]) 
freqArray = arange(actShape[0]) 
X,Y = meshgrid(self.testFreqArray,self.testFreqArray) 
Z = sum(activationTrace[:,:,beg:end],axis=2) 
surf = ax.contourf(X,Y,Z, 8, cmap=cm.jet) 
ax.set_position([0.12,0.15,.8,.8]) 
ax.set_ylabel('Log Frequency (Hz)') 
ax.set_xlabel('Log Frequency (Hz)') 
ax.set_xscale('log') 
ax.set_yscale('log') 
ax.xaxis.set_minor_formatter(FormatStrFormatter('%d')) 
ax.yaxis.set_ticks_position('left') 
ax.xaxis.set_ticks_position('bottom') 
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2) 
self.plotSetAxisLabels(ax,22) 
self.plotSetAxisTickLabels(ax,18) 
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02) 
cbar.set_label('Activation',size=18) 
return ax, cbar 

enter image description here

Second Code:

fig = figure(figto) 
ax = fig.add_subplot(111) 
actShape = activationTrace.shape 
semitones = arange(actShape[1]) 
freqArray = arange(actShape[0]) 
X,Y = meshgrid(self.testFreqArray,self.testFreqArray) 
Z = sum(activationTrace[:,:,beg:end],axis=2) 
surf = ax.contourf(X,Y,Z, 8, cmap=cm.jet) 
ax.set_position([0.12,0.15,.8,.8]) 
ax.set_ylabel('Log Frequency (Hz)') 
ax.set_xlabel('Log Frequency (Hz)') 
ax.set_xscale('log') 
ax.set_yscale('log') 
ax.xaxis.set_minor_formatter(FormatStrFormatter('%d')) 
ax.yaxis.set_minor_formatter(FormatStrFormatter('%d')) 
ax.yaxis.set_ticks_position('left') 
ax.xaxis.set_ticks_position('bottom') 
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2) 
self.plotSetAxisLabels(ax,22) 
self.plotSetAxisTickLabels(ax,18) 
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02) 
cbar.set_label('Activation',size=18) 
count = 0 
for i in ax.xaxis.get_minorticklabels(): 
    if (count%4 == 0): 
     i.set_fontsize(12) 
    else: 
     i.set_fontsize(0) 
    count+=1 
for i in ax.yaxis.get_minorticklabels(): 
    if (count%4 == 0): 
     i.set_fontsize(12) 
    else: 
     i.set_fontsize(0) 
    count+=1 
return ax, cbar 

enter image description here

Đối với colorbar: Một câu hỏi nhanh chóng nếu bạn không nhớ vì cố gắng để tìm ra b ut không hoàn toàn chắc chắn. Tôi muốn sử dụng ký pháp khoa học mà tôi có thể nhận được với ScalarFormatter. Làm cách nào để đặt số chữ số thập phân và số nhân ?? Tôi muốn nó giống như 8x10^8 hoặc .8x10^9 để tiết kiệm không gian thay vì đặt tất cả các số không. Tôi hình có nhiều cách để làm điều này bên trong đối tượng trục nhưng những gì bạn nghĩ là cách tốt nhất. Tôi không thể tìm ra cách thay đổi ký hiệu khi thay đổi thành ScalarFormatter.

Đối với biểu đồ: Ngoài ra, dữ liệu của tôi có điểm bắt đầu từ 46 và sau đó nhân với số nhân nhân với 2^(1/12) nhân với 46,49,50,55,58,61 ... 3132 . Đây là tất cả làm tròn nhưng nằm gần 2^(1/12). Tôi quyết định nên đặt những mã cổ phiếu lớn gần với những con số này. Là cách tốt nhất để sử dụng định dạng cố định và sử dụng một ticker mỗi 15 hoặc hơn trong freqArray. Sau đó, sử dụng một ticker nhỏ ở mọi tần số khác. Tôi có thể làm điều này và vẫn duy trì một trục log ??

Trả lời

80

1) Sử dụng FixedLocator để xác định tĩnh các vị trí đánh dấu rõ ràng.

2) Colorbar cbar sẽ có thuộc tính ax sẽ cung cấp quyền truy cập vào các phương pháp trục thông thường bao gồm định dạng đánh dấu.

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111) 
x = np.arange(10,3000,100) 
y = np.arange(10,3000,100) 
X,Y = np.meshgrid(x,y) 
Z = np.random.random(X.shape)*8000000 
surf = ax.contourf(X,Y,Z, 8, cmap=plt.cm.jet) 
ax.set_ylabel('Log Frequency (Hz)') 
ax.set_xlabel('Log Frequency (Hz)') 
ax.set_xscale('log') 
ax.set_yscale('log') 
ax.xaxis.set_minor_formatter(plt.FormatStrFormatter('%d')) 
# defining custom minor tick locations: 
ax.xaxis.set_minor_locator(plt.FixedLocator([50,500,2000])) 
ax.yaxis.set_ticks_position('left') 
ax.xaxis.set_ticks_position('bottom') 
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2) 
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02) 
cbar.set_label('Activation',size=18) 
# access to cbar tick labels: 
cbar.ax.tick_params(labelsize=5) 
plt.show() 

enter image description here

Sửa

Nếu bạn muốn marls đánh dấu, nhưng bạn muốn lựa chọn hiển thị các nhãn, tôi thấy không có gì sai với lặp của bạn, ngoại trừ tôi có thể sử dụng set_visible thay vì làm cho phông chữ không.

Bạn có thể thưởng thức kiểm soát tốt hơn sử dụng một FuncFormatter nơi bạn có thể sử dụng giá trị hoặc vị trí của loài ve để quyết định xem nó được hiển thị:

def show_only_some(x, pos): 
    s = str(int(x)) 
    if s[0] in ('2','5'): 
     return s 
    return '' 

ax.xaxis.set_minor_formatter(plt.FuncFormatter(show_only_some)) 
+0

Đó là công cụ giao phối tốt. Tôi không nghĩ rằng để sử dụng set_visible ở đây nhưng đó là tốt hơn so với thiết lập phông chữ để kích thước 0 bởi vì nó vẫn còn ít nhất một pixel khi bạn làm điều đó. Tôi muốn đánh dấu đánh dấu ở đó để FixedLocator sẽ không làm việc trong trường hợp này, nhưng tôi làm như vẻ của FuncFormatter. Tôi sẽ gắn bó với những gì tôi có cho bây giờ nhưng có thể cho rằng đi một thời gian tới. Đối với FuncFormatter, nó luôn lấy hai tham số theo thứ tự đó (giá trị, dấu vị trí). –

+0

Đã trả lời câu hỏi của riêng tôi về FuncFormatter vì vậy đừng lo lắng về điều đó. Cảm ơn đống. Trên thực tế chỉ cần thực hiện FuncFormatter vì gần như dễ dàng hơn và giống như sự linh hoạt cực đoan nếu tôi cần phải thay đổi nó trong tương lai làm cho nó thực sự dễ dàng. –

+0

Bạn được chào đón. Rất vui được trợ giúp – Paul

0

Dựa trên câu trả lời từ @ Paul Tôi tạo ra các chức năng sau:

def get_formatter_function(allowed_values, datatype='float'): 
    """returns a function, which only allows allowed_values as axis tick labels""" 
    def hide_others(value, pos): 
     if value in allowed_values: 
      if datatype == 'float': 
       return value 
      elif datatype == 'int': 
       return int(value) 
     return '' 
    return hide_others 

Điều gì linh hoạt hơn một chút.

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