我尝试在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)
我的问题是:
1.如何控制条形组之间的间距?现在的空间很大,看起来很傻。请注意,我不想让酒吧更广泛-我希望他们有相同的宽度,但更接近。
1.如何使标签位于条形图组的中心位置?我试图提出一些算术计算来将xlabels定位在正确的位置(请参阅上面的代码),但它仍然有点偏离……这感觉有点像编写绘图库而不是使用绘图库。如何解决这个问题?(matplotlib是否有一个 Package 器或内置实用程序,其中这是默认行为?)
**编辑:**回复@mlgill:谢谢你的回答。您的代码当然更加优雅,但仍然存在相同的问题,即条的宽度和组之间的间距没有单独控制。你的图表看起来是正确的,但是条太宽了--看起来像Excel图表--我想把条变细。
宽度和边距现在是链接的,所以如果我尝试:
margin = 0.60
width = (1.-2.*margin)/num_items
它使酒吧更瘦,但使集团远离,所以情节再次看起来不正确。
如何创建一个包含两个参数的分组条形图函数:每个条的宽度和条组之间的间距,并像代码那样正确绘制,即。x轴标签位于组的下方
我认为,由于用户必须计算特定的底层布局数量,如边距和宽度,我们基本上仍然在编写绘图库:)
3条答案
按热度按时间j2cgzkjk1#
其实我觉得这个问题最好通过调整
figsize
和width
来解决;下面是我使用figsize=(2,7)
和width=0.3
的输出:顺便说一句,如果你使用
pandas
Package 器,这种类型的事情变得简单得多(我还导入了seaborn
,这不是解决方案所必需的,但在我看来,它使图看起来更漂亮,更现代):bqujaahr2#
解决这两个问题的诀窍是理解Matplotlib中的条形图期望每个系列(G1,G2)的总宽度为“1.0”,计算两边的边距。因此,最简单的方法可能是设置边距,然后根据每个系列有多少条来计算每个条的宽度。在您的情况下,每个系列有两个条形。
假设您左对齐每个条形图,而不是像您所做的那样居中对齐,此设置将导致x轴上从0.0到1.0,1.0到2.0等的系列。因此,每个系列的确切中心,即您希望标 checkout 现的位置,将位于0.5,1.5等。
我已经清理了你的代码,因为有很多无关的变量。请参见内部评论。
xienkqul3#
我读了Paul Ivanov在Nabble上发布的一个答案,它可能会以更低的复杂性解决这个问题。只需将索引设置如下。这将增加分组列之间的间距。