Tiêu đề hình con số Matplotlib chồng lên nhãn trục khi sử dụng twiny


139

Tôi đang cố gắng vẽ hai đại lượng riêng biệt trên cùng một biểu đồ bằng cách sử dụng twiny như sau:

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à dữ liệu được trình bày tốt, nhưng tôi gặp vấn đề là tiêu đề hình trùng với các nhãn trục trên trục x thứ cấp sao cho nó dễ đọc (tôi muốn đăng một ví dụ hình ảnh ở đây, nhưng tôi không có rep đủ cao chưa).

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


1
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, người dùng đại diện cao hơn sẽ nhúng hình ảnh vào bài đăng của bạn cho bạn.
Hooked

@Magic - Bạn có xem xét lại câu trả lời nào để chấp nhận cho câu hỏi này không? Matplotlib đã thêm một cơ chế dựng sẵn để 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)
Amelio Vazquez-Reina

Câu trả lời:


243

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

plt.title(figure_title, y=1.08)

Điều này cũng hoạt động 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 .
Felix Hoffmann

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đã thực hiện xytranh luận trong một thời gian rất dài (miễn là tôi có thể nhớ, với bất kỳ giá nào).
Joe Kington

3
plt.set_title ('chuỗi tiêu đề', y = 1.08) hoạt động với tôi.
Yu Shen

3
Sẽ hữu ích hơn nếu ai đó giải thích đơn vị 1.08 là gì và mặc định là gì. Sự hiểu biết của tôi là mặc định là 1
kon psych

3
@ John Johnumm các trục.
herrlich10

33

Quên sử dụng plt.titlevà đặt văn bản trực tiếp với plt.text. Một ví dụ 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()

nhập mô tả hình ảnh ở đây


@ user815423426 có, tight_layoutdường như vẫn không chơi tốt với các vị trí không chuẩn. Có lẽ bạn có thể làm một báo cáo lỗi?
Móc vào

2
Tôi đã tìm thấy một công việc xung quanh khi sử dụng chặt chẽ, ít nhất là khi bạn lưu cốt truyện của mình bằng hình.s.sff () . Nếu title = plt.title(...)sau đó, bạn có thể chỉ định đóng khung cốt truyện chặt chẽ xung quanh tiêu đề bằng cách sử dụng tùy chọn bbox_extra_artists:figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
rácaholik

10
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ủa mình, cốt truyện được vẽ ngay bên dưới tiêu đề. Đó cũng có thể là một giải pháp nhanh chóng.


8

Tôi đã gặp vấn đề với nhãn x chồng lên tiêu đề phụ; điều này làm việc cho tôi:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

trước

nhập mô tả hình ảnh ở đây

sau

nhập mô tả hình ảnh ở đây

tài liệu tham khảo:


4

Chỉ cần sử dụng plt.tight_layout()trước plt.show(). Nó hoạt động tốt.


4

Bạn có thể sử dụng pad cho trường hợp này:

ax.set_title("whatever", pad=20)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.