2012-05-09 29 views
49

Tôi có một câu hỏi rất đơn giản. Tôi cần phải có một trục x thứ hai trên cốt truyện của tôi và tôi muốn rằng trục này có một số lượng nhất định của tics tương ứng với vị trí nhất định của trục đầu tiên.Cách thêm trục x thứ hai vào matplotlib

Hãy thử một ví dụ. Ở đây tôi đang âm mưu thực hiện khối lượng vật chất tối là một chức năng của hệ số mở rộng, định nghĩa là 1/(1 + z), mà dao động từ 0 đến 1.

semilogy(1/(1+z),mass_acc_massive,'-',label='DM') 
xlim(0,1) 
ylim(1e8,5e12) 

Tôi muốn có một trục x, trên đầu cốt truyện của tôi, hiển thị z tương ứng cho một số giá trị của hệ số mở rộng. Điều đó có thể không? Nếu có, làm thế nào tôi có thể có xtics axe

+0

Bạn đang sử dụng thư viện vẽ đồ thị nào? – sth

+0

Các hàm bạn đang sử dụng không được xây dựng trong python - Tôi cho rằng bạn đang nói về [matplotlib] (http://matplotlib.sourceforge.net/)? Nếu có, câu hỏi [Làm cách nào để vẽ nhiều trục x hoặc y trong matplotlib?] (Http: // stackoverflow.com/questions/3918028/how-do-i-lô-nhiều-x-hoặc-y-trục-trong-matplotlib) dường như bao gồm này. – James

+0

Tôi đã chỉnh sửa tiêu đề, vâng tôi đang sử dụng matplotlib. – Brian

Trả lời

68

Tôi đang tham gia một gợi ý từ những ý kiến ​​trong @ Dhara của câu trả lời, có vẻ như bạn muốn thiết lập một danh sách các new_tick_locations bởi một hàm từ trục x cũ đến trục x mới. Các tick_function dưới đây mất trong một mảng NumPy điểm, bản đồ chúng vào một giá trị mới và định dạng chúng:

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twiny() 

X = np.linspace(0,1,1000) 
Y = np.cos(X*20) 

ax1.plot(X,Y) 
ax1.set_xlabel(r"Original x-axis: $X$") 

new_tick_locations = np.array([.2, .5, .9]) 

def tick_function(X): 
    V = 1/(1+X) 
    return ["%.3f" % z for z in V] 

ax2.set_xlim(ax1.get_xlim()) 
ax2.set_xticks(new_tick_locations) 
ax2.set_xticklabels(tick_function(new_tick_locations)) 
ax2.set_xlabel(r"Modified x-axis: $1/(1+X)$") 
plt.show() 

enter image description here

+0

chính xác những gì tôi cần – eusoubrasileiro

+1

Nếu bạn muốn thêm tiêu đề, hãy xem câu hỏi này: http://stackoverflow.com/questions/12750355/python-matplotlib-figure-title-overlaps-axes-label-when-using- twiny – szmoore

+0

@Hooked, bất kỳ ý tưởng nếu nó có thể này với một trong các quy mô trong quy mô đăng nhập? – tiago

12

Bạn có thể sử dụng song sinh để tạo 2 thang trục x. Ví dụ:

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twiny() 

a = np.cos(2*np.pi*np.linspace(0, 1, 60.)) 

ax1.plot(range(60), a) 
ax2.plot(range(100), np.ones(100)) # Create a dummy plot 
ax2.cla() 
plt.show() 

Ref: http://matplotlib.sourceforge.net/faq/howto_faq.html#multiple-y-axis-scales

Output: enter image description here

+0

Tôi xin lỗi nhưng đó không phải là những gì tôi đã hỏi. Tôi không cần phải âm mưu cho các chức năng trên cùng một lô với trục khác nhau. Tôi chỉ cần có một trục x thứ hai, trên đầu cốt truyện của tôi, được đánh dấu tương ứng với một số vị trí đặc biệt trên trục x đầu tiên. – Brian

+0

Sau đó, chỉ cần thêm một trục 2 giả với phạm vi bạn muốn và xóa nó. Xem câu trả lời đã chỉnh sửa của tôi – Dhara

+0

Xin lỗi nhưng mã của bạn không hoạt động. Tôi đã sao chép và dán nó và sau đó là trục x thứ hai chồng chéo với trục thứ nhất. – Brian

7

Trả lời câu hỏi của bạn trong ý kiến ​​trả lời Dhara của: "tôi sẽ thích trên x thứ hai -axis các tics: (7,8,99) tương ứng với vị trí trục x 10, 30, 40. Có thể theo một cách nào đó không? " Vâng, đúng vậy.

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 

a = np.cos(2*np.pi*np.linspace(0, 1, 60.)) 
ax1.plot(range(60), a) 

ax1.set_xlim(0, 60) 
ax1.set_xlabel("x") 
ax1.set_ylabel("y") 

ax2 = ax1.twiny() 
ax2.set_xlabel("x-transformed") 
ax2.set_xlim(0, 60) 
ax2.set_xticks([10, 30, 40]) 
ax2.set_xticklabels(['7','8','99']) 

plt.show() 

Bạn sẽ nhận được: enter image description here

5

Nếu Bạn muốn trục trên của bạn là một chức năng của trục dưới tick-giá trị:

import matplotlib.pyplot as plt 

fig, ax1 = plt.subplots() 

ax1 = fig.add_subplot(111) 

ax1.plot(range(5), range(5)) 

ax1.grid(True) 

ax2 = ax1.twiny() 
ax1Xs = ax1.get_xticks() 

ax2Xs = [] 
for X in ax1Xs: 
    ax2Xs.append(X * 2) 

ax2.set_xticks(ax1Xs) 
ax2.set_xbound(ax1.get_xbound()) 
ax2.set_xticklabels(ax2Xs) 

title = ax1.set_title("Upper x-axis ticks are lower x-axis ticks doubled!") 
title.set_y(1.1) 
fig.subplots_adjust(top=0.85) 

fig.savefig("1.png") 

Cung cấp:

enter image description here

+0

+1 thiết lập các ràng buộc là những gì tôi đang tìm kiếm – dashesy

0

Tôi buộc phải đăng bài này dưới dạng n trả lời thay vì nhận xét do danh tiếng thấp. Tôi gặp vấn đề tương tự với Matteo. Sự khác biệt là tôi không có bản đồ từ trục x đầu tiên của tôi đến trục x thứ hai của tôi, chỉ có các giá trị x. Vì vậy, tôi muốn đặt dữ liệu trên trục x thứ hai của mình trực tiếp, chứ không phải là ve, tuy nhiên, không có axes.set_xdata. Tôi đã có thể sử dụng câu trả lời Dhara để làm điều này với một sự sửa đổi:

ax2.lines = [] 

thay vì sử dụng:

ax2.cla() 

Khi sử dụng cũng xóa cốt truyện của tôi từ ax1.

+1

Đây sẽ là một câu trả lời tốt hơn nếu bạn cung cấp các ví dụ mã, thay vì chỉ là những thay đổi từ câu trả lời của Dhara. – Benjamin

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