Matplotlib极地条形图传说

时间:2014-08-17 09:32:24

标签: python matplotlib

我从调查问卷中获得了一些数据,这些数据提供了6"维度和答案的答案。 (每个答案代表0-4的值)。我试图绘制6"尺寸中的每一个的平均值"在极地条形图中。

这是我的代码:

#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt

data = np.array([2.83333333, 1.6, 1.75, 2.6, 0.875, 1.75])

N = len(data)
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = data
width = 2 * np.pi / N

ax = plt.subplot(111, polar=True)

bars = ax.bar(theta, radii, width=width, bottom=0.0)
ax.yaxis.set_ticks([0,1,2,3,4])
ax.yaxis.set_ticklabels(['None','Mild','Moderate','Severe','Extreme'])
ax.xaxis.set_ticks(theta)
ax.xaxis.set_ticklabels([1,2,3,4,5,6])

ax.legend(['foo','bar','snafu','swag','s-fus','tarfu'])

for r, bar in zip(theta, bars):
    bar.set_facecolor(plt.cm.jet(r / np.pi / 2))
    bar.set_alpha(0.8)

plt.show()

结果如下:

http://i60.tinypic.com/2rxaatc.png http://i60.tinypic.com/2rxaatc.png

我选择尝试使用图例命名条形图,因为实际描述会很长,例如"理解和沟通"。另一种方法是在主要刻度之间使用x-tick标签(我不知道如何做到这一点,但无论如何它可能看起来很糟糕。)

现在:为什么其他传奇人物不会出现(我随机也得到了第二个,但那是关于它的?)

1 个答案:

答案 0 :(得分:0)

bars是一个Container对象,其中包含构成条形图的六个matplotlib.patches.Rectangle。默认情况下,legend()似乎将其视为单个艺术家,因此您只需为条形图获取一个图例项目。

您可以强制legend()通过使用替代语法调用每个艺术家的单独图例项目:

legend(sequence_of_artists, sequence_of_labels, ...)

试试这个:

ax.legend(bars, ['foo','bar','snafu','swag','s-fus','tarfu'])

更改条形图的颜色后,您需要创建图例,否则图例上的颜色将与条形图的颜色不匹配。


获得相同结果的另一种方法是设置每个条形的label属性,类似于当前设置颜色的方式。当每个柱子都有自己的label时,legend()会自动将它们视为单独的,并为每个柱体绘制图例项。

...
labels = ['foo','bar','snafu','swag','s-fus','tarfu']
for r, bar, ll in zip(theta, bars, labels):
    bar.set_facecolor(plt.cm.jet(r / np.pi / 2))
    bar.set_alpha(0.8)
    bar.set_label(ll)

ax.legend()
...