使用matplotlib正确对齐Python中的极坐标图

时间:2018-02-04 17:44:58

标签: python matplotlib

fig, ax = plt.subplots(1, 2, subplot_kw=dict(projection='polar'))

ax[0].set_theta_zero_location("N")
ax[0].set_theta_direction(-1)
cax = ax[0].contourf(theta, r, values_2d,100)
cb = fig.colorbar(cax)
cb.set_label("Distance")

dax = ax[1].contourf(theta, r, d_values_2d,2)
db = fig.colorbar(dax)
db.set_label("Gradient")

plt.tight_layout(pad=0.4, w_pad=0.5)

plt.show()

上图有两个图。但是,我无法找到让colorbar与每个人物坐在一起的方法。另外,它们的尺寸不同,为什么?

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以使用关键字Axes将要附加颜色条的fig.colorbar()实例传递到ax。来自文档:

  

ax:Axes,Axes列表,可选

     

父轴,新颜色条轴的空间将被盗取。   如果给出了一个轴列表,它们将被调整大小以便为其腾出空间   色条轴。

另外,为了避免重叠,您可以传递关键字pad。这里有一些改进的代码版本:

from matplotlib import pyplot as plt
import numpy as np

#the coordinates
theta = np.linspace(0,2*np.pi, 100)
r = np.linspace(0,1,100)

#making up some data    
theta,r = np.meshgrid(theta,r)
values_2d = np.sin(theta)*np.exp(-r)

d_values_2d = np.cos(theta)*np.sqrt(r)

fig, ax = plt.subplots(
    1, 2, subplot_kw=dict(projection='polar'),
    figsize = (10,4)
)

ax[0].set_theta_zero_location("N")
ax[0].set_theta_direction(-1)
cax = ax[0].contourf(theta, r, values_2d,100)

#the first altered colorbar command
cb = fig.colorbar(cax, ax = ax[0], pad = 0.1)
cb.set_label("Distance")

dax = ax[1].contourf(theta, r, d_values_2d,2)

#the second altered colorbar command
db = fig.colorbar(dax, ax = ax[1], pad = 0.1)
db.set_label("Gradient")

plt.tight_layout(pad=0.4, w_pad=0.5)

plt.show()

这给出了以下结果: result of the above code

至于为什么你得到原始代码所得的数字,我猜测如果没有ax关键字,colorbar必须猜测将颜色条放在哪里,它会使用当前活动的Axes实例或最后创建的实例。此外,由于两个颜色条都附加到相同的轴上,因此实际绘图的空间较小,这就是为什么示例中的右图比左图小的原因。