我正在尝试在matplotlib中制作分组条形图,按照画廊中的示例。我使用以下代码:
import matplotlib.pyplot as plt
plt.figure(figsize=(7,7), dpi=300)
xticks = [0.1, 1.1]
groups = [[1.04, 0.96],
[1.69, 4.02]]
group_labels = ["G1", "G2"]
num_items = len(group_labels)
ind = arange(num_items)
width = 0.1
s = plt.subplot(1,1,1)
for num, vals in enumerate(groups):
print "plotting: ", vals
group_len = len(vals)
gene_rects = plt.bar(ind, vals, width,
align="center")
ind = ind + width
num_groups = len(group_labels)
# Make label centered with respect to group of bars
# Is there a less complicated way?
offset = (num_groups / 2.) * width
xticks = arange(num_groups) + offset
s.set_xticks(xticks)
print "xticks: ", xticks
plt.xlim([0 - width, max(xticks) + (num_groups * width)])
s.set_xticklabels(group_labels)
我的问题是:
我如何控制条形图组之间的间距?现在间距很大,看起来很傻。请注意,我不想使条形宽度更宽 - 我希望它们具有相同的宽度,但彼此更接近。
我如何让标签居中显示在条形图组下方?我试图想出一些算术计算来将x轴标签定位到正确的位置(请参见上面的代码),但仍然略微偏离...感觉有点像编写绘图库而不是使用绘图库。如何解决这个问题?(是否有matplotlib的包装器或内置实用程序,其中这是默认行为?)
编辑:回复@mlgill:谢谢您的答案。您的代码确实更加优雅,但仍然存在相同的问题,即条形图的宽度和组之间的间距不能分别控制。您的图表看起来正确,但条形太宽了 - 看起来像Excel图表 - 我想让条形变窄。
现在宽度和边距是链接在一起的,所以如果我尝试:
margin = 0.60
width = (1.-2.*margin)/num_items
它使得条形图更窄,但是将组分开得很远,所以绘图看起来不正确。
我该如何编写一个分组条形图函数,它接受两个参数:每个条形图的宽度和条形图组之间的间距,并像您的代码一样正确地绘制,即在组下方居中显示x轴标签?
我认为,由于用户必须计算特定的低级布局量,如边距和宽度,因此我们仍然基本上是在编写绘图库 :)