Python 使用matplotlib为水平条形图创建替代y轴标签

Python 使用matplotlib为水平条形图创建替代y轴标签,python,matplotlib,Python,Matplotlib,这是对我刚才提出的一个问题的(更清晰的)回复,我的身份识别让人困惑 您好,我不熟悉使用matplotlib.pyplot用python作图,花了大量时间在这个网站和其他网站上搜索,并试图弄清楚这一点,但我还没有成功地完成我想做的事情 使用下面的代码,我生成了下图,这是一个课程集合,以及继续完成课程的注册人数百分比: 我的代码正在创建什么: 但是,我希望用python生成的内容如下(用MS paint粗略制作,以向您传达我希望代码生成的内容): 我要创建的内容: 右边的轴标签是每个课程的注册人

这是对我刚才提出的一个问题的(更清晰的)回复,我的身份识别让人困惑

您好,我不熟悉使用matplotlib.pyplot用python作图,花了大量时间在这个网站和其他网站上搜索,并试图弄清楚这一点,但我还没有成功地完成我想做的事情

使用下面的代码,我生成了下图,这是一个课程集合,以及继续完成课程的注册人数百分比: 我的代码正在创建什么:

但是,我希望用python生成的内容如下(用MS paint粗略制作,以向您传达我希望代码生成的内容):

我要创建的内容:

右边的轴标签是每个课程的注册人数,这是我想要的附加信息。另一种解决方案是在图表中显示注册编号,并将其写在条形图的末尾。但任何有效的都是好的

import matplotlib.pyplot as plt
y = ['Physics','Chemistry','Economics','Philosophy','Computer Science','Sociology','Biology','History','Overall']
x = [0.0,33.333333333333336,50.0,50.0,50.0,54.54545454545455,58.333333333333336,100.0,51.851851851851855]
alternativeYlabels = ['54', '1', '3', '12', '12', '2', '11', '12', '1']
plt.barh(y,x)
plt.title('Percent Completion Rate of Each Course')

plt.show()
如何修改代码以满足需要?另外,我如何在我的绘图中添加垂直网格线,对应于这里的每个20%


谢谢

以下是两种解决方案:您需要添加一个
twinx
轴。在
plt.show()
之前添加以下行。如果您想将值放在条形图的顶部,而不是右侧的第二个y轴上,您可以查看我几周前提供的类似答案(我将下面的代码与输出一起附上)

输出

可选所需输出(参见答案中的链接)编辑:根据@ImportanceOfBeingErnest的建议对文本进行垂直对齐

ax.xaxis.grid(True)
for i in range(len(x)):
    ax.text(x[i]+1, i, alternativeYlabels[::-1][i], color='black', fontweight='bold', va="center")
输出

我改编了matplotlib示例中的代码,该示例在绘图的两侧都有两个单独的刻度。主要区别在于,这里的第二个条形图是虚拟的(每个条形图的高度为0)。我认为这是最简单的方法(无需手动添加记号等)

运行下面的代码应生成此图:


谢谢。它工作得非常好(我只需要在这里添加ax=plt.gca()):您可以使用
I
本身作为垂直位置<代码>ax.text(x[i]+1,i,…,va=“中心”@ImportanceOfBeingErnest:这里也编辑并确认了您的建议。再次感谢。虽然我已经用其他用户的答案解决了这个问题,但我仍然要提到您的图形FYI有一个问题。请看右轴-只有6个刻度,与九个总条不对齐。@zzzzz 94感谢下面的内容向上!我在发布答案时没有注意到这一点。问题是
plt.bar()。
ax.xaxis.grid(True)
for i in range(len(x)):
    ax.text(x[i]+1, i, alternativeYlabels[::-1][i], color='black', fontweight='bold', va="center")
# Initialize parameters as in your post
import matplotlib.pyplot as plt
y = ['Physics','Chemistry','Economics','Philosophy','Computer Science','Sociology','Biology','History','Overall']
x = [0.0,33.333333333333336,50.0,50.0,50.0,54.54545454545455,58.333333333333336,100.0,51.851851851851855]
alternativeYlabels = ['54', '1', '3', '12', '12', '2', '11', '12', '1']

# This time draw the bar plot from an 'axes' object
ax1 = plt.subplot(111)
ax1.barh(y,x)

# Draw a second 'dummy' barplot just to define the second ticks
ax2 = ax1.twinx()
ax2.barh(range(len(x)), [0]*len(x), tick_label=alternativeYlabels[::-1])  # don't forget to reverse the labels 

# Add the vertical grid
ax1.xaxis.grid(True)

# Add a title and show figure
plt.title('Percent Completion Rate of Each Course')
plt.show()