微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在matplotlib中将条形图的xticks居中?

如何解决如何在matplotlib中将条形图的xticks居中?

我正在按照本教程为我的条形图增加价值 link

博客显示代码是这样写的

from matplotlib import pyplot as plt
import numpy as np

years = [1901,1911,1921,1931,1941,1951,1961,1971,1981,1991,2001,2011]
population = [237.4,238.4,252.09,251.31,278.98,318.66,361.09,439.23,548.16,683.33,846.42,1028.74]

x = np.arange(len(years)) # the label locations
width = 0.35 # the width of the bars

fig,ax = plt.subplots()

ax.set_ylabel('Population(in million)')
ax.set_title('Years')
ax.set_xticks(x)
ax.set_xticklabels(years)

pps = ax.bar(x - width/2,population,width,label='population')
for p in pps:
   height = p.get_height()
   ax.annotate('{}'.format(height),xy=(p.get_x() + p.get_width() / 2,height),xytext=(0,3),# 3 points vertical offset
      textcoords="offset points",ha='center',va='bottom')

plt.show()

所以,输出变成这样

enter image description here

但是,我刚刚意识到条形图中的 xticks 没有居中

enter image description here

我的问题 - 有人知道如何将 xticks 居中吗?

我试图找到解决方案,但还没有找到

任何帮助将不胜感激,谢谢

解决方法

matplotlib 3.4.0 或更新版本中,可以使用 bar_label 代替 annotate

import numpy as np
from matplotlib import pyplot as plt

years = [1901,1911,1921,1931,1941,1951,1961,1971,1981,1991,2001,2011]
population = [237.4,238.4,252.09,251.31,278.98,318.66,361.09,439.23,548.16,683.33,846.42,1028.74]

# Create Tick Locations
x = np.arange(len(years))
# Plotting
fig,ax = plt.subplots(figsize=(10,6))
# Do not offset the values of x to center labels (default)
ax.bar(x,population,width=.35,label='population')

# Labels,ticks,etc.
ax.set_ylabel('Population(in million)')
ax.set_title('Years')
ax.set_xticks(x)
ax.set_xticklabels(years)

# Add Bar Labels
for c in ax.containers:
    ax.bar_label(c)

plt.show()

plot

,

imo 该教程使绘图变得比需要的更加混乱。您很少需要从绘图上的艺术家那里获取坐标。直接使用您的数据即可:

from matplotlib import pyplot as plt
import numpy as np

years = [1901,1028.74]

x_values = np.arange(len(years))
fig,ax = plt.subplots(figsize=(12,4))

ax.bar(x_values,label='population')
for x,y in zip(x_values,population):    
    ax.annotate(
        str(y),# label is our y-value as a string
        xy=(x,y),xytext=(0,3),# 3 points vertical offset
        textcoords="offset points",ha='center',va='bottom'
    )
    
    
ax.set_xticks(x_values)
ax.set_xticklabels(years)
ax.set_ylim(0,1200)

plt.show()

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。