在matplotlib中设置每个bar的位置

ct2axkht  于 2023-05-23  发布在  其他
关注(0)|答案(2)|浏览(206)

这是工作代码。它创建特定长度的条。

# creating the dataset
data = {'C':20, 'C++':15, 'Java':30,
        'Python':35}
courses = list(data.keys())
values = list(data.values())
  
fig = plt.figure(figsize = (10, 5))
 
# creating the bar plot
plt.bar(courses, values, color ='maroon',
        width = 0.4)
 
plt.xlabel("Courses offered")
plt.ylabel("No. of students enrolled")
plt.title("Students enrolled in different courses")
plt.show()

但我需要更多的选择。在未来,我将创建这些酒吧的动画。他们将左右移动。所以我想在x轴上设置条的位置。我该怎么做?
我想要的结果看起来像这样(当我自己设置位置时)

rggaifut

rggaifut1#

要执行您所寻找的操作-在x轴上的特定位置设置每个条形图,您需要为每个条形图使用set_x()。您可以使用container.get_children()获取此值,然后移动它。
请注意,我将数据作为dataframe,并添加了一个名为pos的列。这将定义每个条与x轴零的距离。绘制条形图,然后使用set_x()移动条形图,使用plt.xlim()plt.xticks()对齐刻度和标签。希望这就是你要找的...

# creating the dataset - Using dataframe and adding pos column for distance from zero
data = {'courses' : ['C', 'C++', 'Java', 'Python'], 'values' : [20, 15, 30, 35], 'pos' : [2, 3, 5, 7]}
df=pd.DataFrame(data)

fig = plt.figure(figsize = (10, 5))
# creating the bar plot
plt.bar(df['courses'], df['values'], color ='maroon', width = 0.4)
plt.xlabel("Courses offered")
plt.ylabel("No. of students enrolled")
plt.title("Students enrolled in different courses")

## Set xlim from 0 to largest value plus 0.5 to show all bars
plt.xlim(0, df.pos.max()+0.5)

## Access each bar and set the position based on value in df.pos
for container in plt.gca().containers:
        for i, child in enumerate(container.get_children()):
            child.set_x(df.pos[i]-0.2) ## 0.2 as you set width=0.4

##Adjust ticks and ticklabels
plt.xticks(ticks=df.pos, labels=df.courses)
plt.show()

lb3vh1jj

lb3vh1jj2#

也许你只需要重新排列一下字典的键就行了?

d = {k: data[k] for k in ["Java", "C++", "Python", "C"]} # <-- re-ordered `data`
P = [3, 5, 8, 13] # <-- positions of each bar/x-tick
W = 1.5 # <-- width of the bars

plt.figure(figsize=(7, 4))

plt.bar(P, d.values(), color="maroon", width=W)

plt.xticks(P, d.keys())
plt.xlim(0, max(P) + W)

输出:

相关问题