简体   繁体   English

Matplotlib:如何让我的条形图填充整个x轴?

[英]Matplotlib: How do I make my bar plot fill the entire x-axis?

I have a bar plot drawn in matplotlib as such: 我有一个在matplotlib中绘制的条形图: 条形图有问题

The x-ticks do not span the entire range of x axis. x-ticks不跨越x轴的整个范围。 How do I make that happen? 我该如何做到这一点?

My code is here: 我的代码在这里:

def counter_proportions(counter):
    total = sum(counter.values())

    proportions = dict()
    for key, value in counter.items():
        proportions[key] = float(value)/float(total)

    return proportions

def categorical_counter_xlabels(counter):
    idxs = dict()

    for i, key in enumerate(counter.keys()):
        idxs[key] = i

    return idxs

# Use this dummy data
detailed_hosts = ['Species1' * 3, 'Species2' * 1000, 'Species3' * 20, 'Species4' * 20]
# Create a detailed version of the counter, which includes the exact species represented.
detailed_hosts = []

counts = Counter(detailed_hosts)
props = counter_proportions(counts)
xpos = categorical_counter_xlabels(counts)

fig = plt.figure(figsize=(16,10))
ax = fig.add_subplot(111)
plt.bar(xpos.values(), props.values(), align='center')
plt.xticks(xpos.values(), xpos.keys(), rotation=90)
plt.xlabel('Host Species')
plt.ylabel('Proportion')
plt.title("Proportion of Reassortant Viruses' Host Species")
plt.savefig('Proportion of Reassortant Viruses Host Species.pdf', bbox_inches='tight')

Manual bar spacing 手动条间距

You can gain manual control over where the locations of your bars are positioned (eg spacing between them), you did that but with a dictionary - instead try doing it with a list of integers. 您可以手动控制条形位置的位置(例如它们之间的间距),您可以使用字典进行操作 - 而是尝试使用整数列表。

Import scipy

xticks_pos = scipy.arange( len( counts.keys() )) +1

plt.bar( xticks_pos, props.values(), align='center')

If you lack scipy and cannot be bothered to install it, this is what arange() produces: 如果你缺乏scipy并且无法安装它,这就是arange()产生的:

In [5]: xticks_pos

Out[5]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

Controlling the margins 控制边距

Above deals with spacing between bars, and as @JoeKington mentioned in comments the other parts you can control (eg if you do not want to control spacing and instead want to restrict margins, etc.): 上面讨论条形之间的间距,并且@JoeKington在评论中提到了你可以控制的其他部分(例如,如果你不想控制间距而是想限制边距等):

plt.axis('tight')

plt.margins(0.05, 0)

plt.xlim(x.min() - width, x.max() + width))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM