2012-10-05 31 views
91

Tôi cố gắng để vẽ hai đại lượng riêng biệt trên đồ thị tương tự sử dụng twiny như sau:Python Matplotlib hình tiêu đề trùng lặp trục nhãn khi sử dụng twiny

fig = figure() 
ax = fig.add_subplot(111) 
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-') 
ax.set_yscale('log') 
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000)) 
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0])) 
ax.set_xlabel('Rotational period (hrs)') 
ax.set_ylabel('Orbital radius (km), logarithmic') 
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top') 


ax2 = ax.twiny() 
ax2.plot(v,r,'k-') 
ax2.set_xlabel('Linear speed (ms-1)') 

show() 

và các dữ liệu được trình bày tốt, nhưng tôi đang gặp vấn đề rằng tiêu đề hình là chồng chéo với các nhãn trục trên trục x thứ cấp để nó khó đọc được (tôi muốn đăng một ví dụ hình ảnh ở đây, nhưng tôi chưa có đại diện đủ cao).

Tôi muốn biết nếu có cách đơn giản để chỉ chuyển tiêu đề trực tiếp lên vài chục pixel để biểu đồ trông đẹp hơn.

+0

Chào mừng bạn đến với Stack Overflow! Nếu bạn liên kết đến một bài đăng imgur của hình ảnh của bạn một người dùng đại diện cao hơn sẽ nhúng hình ảnh trong bài viết của bạn cho bạn. – Hooked

+0

@Magic - Bạn có cân nhắc lại câu trả lời để chấp nhận cho câu hỏi này không? Matplotlib đã thêm một cơ chế nội trang để xử lý nhu cầu chính xác này (câu trả lời được bình chọn nhiều nhất dưới đây) –

Trả lời

169

Tôi không chắc chắn cho dù đó là một tính năng mới trong phiên bản sau của matplotlib, nhưng ít nhất cho 1.3.1, điều này chỉ đơn giản là:

plt.title(figure_title, y=1.08) 

này cũng làm việc cho plt.suptitle(), nhưng không (chưa) cho plt.xlabel() vv

+6

Đối với nhãn, bạn có thể đặt đối số' labelpad', xem [tại đây] (http://stackoverflow.com/a/6406750/692634). –

+1

Đối với những gì nó có giá trị, nó không phải là một tính năng mới. 'title' đã lấy các đối số' x' và 'y' trong một thời gian rất dài (miễn là tôi có thể nhớ, ở bất kỳ tốc độ nào). –

+0

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

29

Quên sử dụng plt.title và đặt văn bản trực tiếp với plt.text. Một ví dụ quá phóng đại được đưa ra dưới đây:

import pylab as plt 

fig = plt.figure(figsize=(5,10)) 

figure_title = "Normal title" 
ax1 = plt.subplot(1,2,1) 

plt.title(figure_title, fontsize = 20) 
plt.plot([1,2,3],[1,4,9]) 

figure_title = "Raised title" 
ax2 = plt.subplot(1,2,2) 

plt.text(0.5, 1.08, figure_title, 
     horizontalalignment='center', 
     fontsize=20, 
     transform = ax2.transAxes) 
plt.plot([1,2,3],[1,4,9]) 

plt.show() 

enter image description here

+0

Cảm ơn vì điều đó, tôi nghĩ rằng nó đã giải quyết được vấn đề của tôi! –

+0

hai vấn đề được giải quyết bởi @hooked trong hai ngày ... cảm ơn –

+0

Điều này dường như không hoạt động hiệu quả khi kết hợp với 'tight_layout' .. –

1
ax.set_title('My Title\n', fontsize="15", color="red") 
plt.imshow(myfile, origin="upper") 

Nếu bạn đặt '\n' ngay sau chuỗi tiêu đề, cốt truyện sẽ được vẽ ngay bên dưới tiêu đề. Đó cũng có thể là một giải pháp nhanh.

+0

điều này không phù hợp với tôi – bgenchel

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