2015-05-26 33 views
6

Tôi muốn tạo các ô có nhãn trục ở cả đỉnh và đáy (hoặc trái và phải) của các cấu hình con của tôi. Các bài đăng khác có chi tiết cách tôi có thể di chuyển các nhãn trục (ví dụ: here).Số mũ trục di chuyển trong matplotlib

Tuy nhiên, tôi đang gặp sự cố với số mũ từ ký hiệu khoa học. Một tối thiểu-ish dụ làm việc minh họa các vấn đề tốt nhất:

import numpy as np 
import matplotlib.pyplot as plt 

vars = 4 
length = 10000 

array = np.zeros((length, vars)) 
array[:,0] = np.random.normal(0.0, 1.0e6, (length)) 
array[:,1] = 1.0e6 * np.tanh(array[:,0]/1.0e6) 
array[:,2] = 1.0e5 * np.random.random((length)) 
array[:,3] = array[:,1] * array[:,2]/1.0e5 

labels = ["var1", "var2", "var3", "var4"] 

plt.figure(figsize=(15, 15)) 

for i in range(vars): 
    for j in range(0, vars): 
     ax = plt.subplot(vars, vars, vars*i + j + 1) 
     ax.xaxis.get_major_formatter().set_powerlimits((-2, 3)) 
     ax.yaxis.get_major_formatter().set_powerlimits((-2, 3)) 
     ax.locator_params(nbins=5) 

     if (j == i): 
      weights = np.ones_like(array[:,i])/len(array[:,i]) 
      ax.hist(array[:,i], 25, weights=weights) 
     else: 
      ax.plot(array[:,j], array[:,i], '.', markersize=0.5) 

     if ((j == 0) & (i % 2 == 0)): 
      ax.yaxis.tick_left() 
      ax.xaxis.set_ticks_position("both") 
      ax.yaxis.set_label_position("left") 
      ax.get_yaxis().get_offset_text().offset_text_position = "left" 
      ax.set_ylabel(labels[i]) 
     elif ((j == vars - 1) & (i % 2 == 1)): 
      ax.yaxis.tick_right() 
      ax.xaxis.set_ticks_position("both") 
      ax.yaxis.set_label_position("right") 
      ax.get_yaxis().get_offset_text().offset_text_position = "right" 
      ax.set_ylabel(labels[i]) 
     else: 
      ax.get_yaxis().set_ticklabels([]) 

     if ((i == 0) & (j % 2 == 1)): 
      ax.xaxis.tick_top() 
      ax.xaxis.set_ticks_position("both") 
      ax.xaxis.set_label_position("top") 
      ax.get_xaxis().get_offset_text().offset_text_position = "top" 
      ax.set_xlabel(labels[j]) 
     elif ((i == vars - 1) & (j % 2 == 0)): 
      ax.xaxis.tick_bottom() 
      ax.xaxis.set_ticks_position("both") 
      ax.xaxis.set_label_position("bottom") 
      ax.get_xaxis().get_offset_text().offset_text_position = "bottom" 
      ax.set_xlabel(labels[j]) 
     else: 
      ax.get_xaxis().set_ticklabels([]) 

plt.savefig("test.png") 

này tạo ra: enter image description here

Như bạn có thể thấy, hàm mũ đã không di chuyển với phần còn lại của bọ ve. Tôi cố gắng

ax.get_yaxis().get_offset_text().offset_text_position = "right" 

ax.get_xaxis().get_offset_text().offset_text_position = "top" 

nhưng họ dường như không có hiệu lực.

+0

Đối với giá trị của nó, "văn bản bù trừ" là giá trị bù trừ (ví dụ: '+ 1e3') không phải là số nhân (' 1e3'), đó là lý do tại sao 'get_offset_text(). Offset_text_position' không có hiệu lực. –

+0

Ah, điều đó có ý nghĩa, thực sự! Tôi đã giả định rằng "bù đắp" được gọi là vị trí của văn bản, không phải là nội dung thực tế. Vậy bạn có biết tôi nên làm gì không? –

+1

Bỏ qua những gì tôi đã nói về sự khác nhau giữa bù đắp và số nhân (mặc dù có một dấu hiệu chung với điều đó, quá, ví dụ: http://stackoverflow.com/questions/28371674/prevent-scientific-notation-in-matplotlib-pyplot/28373421 # 28373421) Gốc của vấn đề của bạn là bạn muốn 'ax.xaxis.offset_text_position =" top "' thay vì 'ax.xaxis.get_offset_text(). Offset_text_position() =" top "'. –

Trả lời

3

Đây là lỗi mà Joe Klington báo cáo: https://github.com/matplotlib/matplotlib/issues/4476 Nếu bạn nhìn vào liên kết đó, có vẻ là một cách giải quyết để xác định vị trí để bù đắp văn bản mà bạn muốn, nhưng nó không phải là đơn giản.

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