2013-06-18 24 views
10

Có cách nào để tăng đệm/bù đắp của các nhãn đánh dấu ô cực (theta) không?matplotlib: thêm padding/offset vào các ô cực đánh dấu các nhãn

import matplotlib 
import numpy as np 
from matplotlib.pyplot import figure, show, grid 

# make a square figure 
fig = figure(figsize=(2, 2)) 
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True, axisbg='#d5de9c') 
ax.set_yticklabels([]) 

r = np.arange(0, 3.0, 0.01) 
theta = 2*np.pi*r 
ax.plot(theta, r, color='#ee8d18', lw=3) 
ax.set_rmax(2.0) 
show() 

Tôi muốn có nhãn đánh dấu theta xa hơn so với ô cực để chúng không trùng lặp.

enter image description here

Trả lời

11

Trước hết; xem như cách bạn đã chỉ định figsize là (2,2) và có ax chiếm 80% cả chiều rộng và chiều cao, bạn có không gian rất nhỏ còn lại để đánh dấu các dấu tick. Điều này có thể làm cho các dấu ticklabels được "cắt bỏ" tại egdes của con số. Đây có thể dễ dàng được "cố định" bởi một trong hai

  • Xác định lớn hơn figsize
  • Tận dụng tối ax chiếm ít không gian trên (2,2) con số kích thước
  • Sử dụng fontsize nhỏ cho ticklabels

hoặc bất kỳ sự kết hợp nào trong số này. Một, theo ý kiến ​​của tôi tốt hơn, giải pháp cho vấn đề này "" là sử dụng một subplot hơn là xác định giới hạn của Axes;

ax = fig.add_subplot(111, polar=True, axisbg='#d5de9c') 

vì điều này làm cho nó có thể sử dụng phương pháp tight_layout() tự động định cấu hình bố cục hình để bao gồm tất cả các yếu tố.

Sau đó, đến vấn đề thực sự trong tầm tay; padding. Trên PolarAxes, bạn có thể đặt, trong số những thứ khác, vị trí xuyên tâm của các theta-ve. Điều này được thực hiện bằng cách xác định phân số của bán kính trục cực nơi bạn muốn các dấu ticklabels được đặt làm đối số cho tham số frac của phương thức set_thetagrids() của PolarAxes. Đối số phải là một phần bán kính của trục mà bạn muốn các dấu ticklabels được đặt. I E. cho frac < 1 các dấu ticklabels sẽ được đặt bên trong các trục, trong khi đối với frac> 1 chúng sẽ được đặt bên ngoài các trục.

Mã của bạn sau đó có thể là một cái gì đó như thế này:

import numpy as np 
from matplotlib.pyplot import figure, show, grid, tight_layout 
# make a square figure 
fig = figure(figsize=(2, 2)) 
ax = fig.add_subplot(111, polar=True, axisbg='#d5de9c') 
ax.set_yticklabels([]) 

r = np.arange(0, 3.0, 0.01) 
theta = 2*np.pi*r 
ax.plot(theta, r, color='#ee8d18', lw=3) 
ax.set_rmax(2.0) 

# tick locations 
thetaticks = np.arange(0,360,45) 

# set ticklabels location at 1.3 times the axes' radius 
ax.set_thetagrids(thetaticks, frac=1.3) 

tight_layout() 

show() 

PolarAxes with frac=1.3

Bạn nên thử các giá trị khác nhau cho frac để tìm một giá trị phù hợp nhất cho nhu cầu của bạn.

Nếu bạn không chỉ định giá trị cho thông số frac như trên, tức là frac có giá trị mặc định None, mã sẽ xuất ra một âm mưu như sau. Lưu ý cách bán kính của ô lớn hơn, vì các dấu ticklabels không "chiếm nhiều không gian" như trong ví dụ trên.

PolarAxes with frac=None

+0

wow, một lời giải thích tuyệt vời! cảm ơn bạn rất nhiều! – dimka

+0

Bạn có biết 'frac' mặc định là gì không? – Annan

+0

@Annan Từ [this] (https://github.com/matplotlib/matplotlib/blob/ff31d67a8103620221a3eeadeb985e8268a7d934/doc/users/whats_new.rst#enhancements-to-polar-plot) có vẻ như 'frac' không còn được dùng nữa. "[...] Do đó, đối số' frac' thành .PolarAxes.set_thetagrids không còn được áp dụng nữa. Đánh dấu có thể được sửa đổi với đối số 'pad' thành .Axes.tick_params hoặc .Axis.set_tick_params." – hooy

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