这是我刚才提出的问题的(更清楚的)转贴,我的身份隐瞒使人们感到困惑。
您好,我是使用matplotlib.pyplot在python中进行图形绘制的新手,并花了很多时间在此站点和其他站点上进行搜索,并试图弄清楚这一点,但我并没有成功实现我想要的功能要做。
使用下面的代码,我生成了以下图形,它是课程的集合以及完成课程的已注册人数的百分比: 我的代码正在创建什么:
但是,我想用python生成的内容类似于以下内容(用MS Paint精心制作,可以将您希望代码生成的所有内容传达给您)
我要创建的内容:
右侧轴标签是每门课程的注册人数,这是我希望提供的其他信息。另一种解决方案是在图表内的条形图的末尾写上注册号。但是一切正常都很好。
location
如何更改代码以适合我的需求?另外,如何在图中也添加垂直网格线,分别对应于此处的20%?
谢谢
答案 0 :(得分:0)
以下是两种解决方案:您需要添加一个twinx
轴。在plt.show()
之前添加以下行。如果您想将值放在条形图的顶部而不是第二个y轴在右侧,则可以看看几周前我提供的this类似答案(我也附上了下面的代码)以及输出)。
ax.xaxis.grid(True) # adding vertical grid lines
ax2 = ax.twinx() # Creating the right hand side y axis
ax_lim = ax.get_ylim()
ax2_lim = (ax_lim[0], ax_lim[1]) # Aligning the limits of both y axes
ax2.set_ylim(ax2_lim)
ax2.set_yticks(range(0, len(y)))
ax2.set_yticklabels(alternativeYlabels[::-1]) # Reverses the list
ax2.set_ylabel("# enrolled in each course",rotation = 270, labelpad=15)
输出
可选的期望输出(请参见答案中的链接)编辑:基于@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")
输出
答案 1 :(得分:0)
我改编了this matplotlib示例中的代码,该示例在绘图的两侧都有两个不同的比例。主要区别在于,此处的第二个条形图是一个虚拟的图(每个条形的高度为0)。我认为这是最简单的方法(无需手动添加刻度线等)
# 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()
运行下面的代码应该会产生此图: