Python Matplotlib:条形图顶部的线,左侧的图例,无样条曲线

Python Matplotlib:条形图顶部的线,左侧的图例,无样条曲线,python,pandas,matplotlib,Python,Pandas,Matplotlib,我在调整下图时遇到问题 以下是数据帧的外观: Year Some All Ratio 0 2016 9 157 0.057325 1 2017 13 189 0.068783 2 2018 21 216 0.097222 3 2019 18 190 0.094737 4 2020 28 284 0.098592 以下是我想做的: 橙色线应该在横杆的前面。我尝试使用zorder参数,但没有效果。我还尝试切换Axi

我在调整下图时遇到问题

以下是数据帧的外观:

   Year  Some  All     Ratio
0  2016     9  157  0.057325
1  2017    13  189  0.068783
2  2018    21  216  0.097222
3  2019    18  190  0.094737
4  2020    28  284  0.098592
以下是我想做的:

  • 橙色线应该在横杆的前面。我尝试使用
    zorder
    参数,但没有效果。我还尝试切换Axis对象的顺序,但它什么也没做
  • 我想要左边的图例。在下面的代码中,您会注意到我使用了一个稍大的
    figsize
    参数。如果我用小一点的,图例会神奇地向左移动,但我不想用小一点的
  • 我想在每个条顶部的条形图上标注相应的值。我尝试对每个值进行迭代,并使用
    ax.annotate
    对条形图进行单独注释,但无法自动将值居中。在这个最小的例子中,所有的值都是三位数,但在原始数据中,我有四位数的数字,我找不到一个好方法使它们都居中
  • 最后,我想去掉上面和右边的刺。下面是我的代码 因为某种原因没有移除它们
下面是帮助人们入门的代码

data={'Year':{0:'2016',1:'2017',2:'2018',3:'2019',4:'2020'},
'一些':{0:9,1:13,2:21,3:18,4:28},
'全部':{0:157,1:189,2:216,3:190,4:284},
‘比率’:{0:0.05732484076433121,
1: 0.06878306878306878,
2: 0.09722222222222222,
3: 0.09473684210526316,
4: 0.09859154929577464}}
df=_______;导入____;(“熊猫”).数据帧(数据)
ax=df.绘图(x=“年”,y=“比率”,
kind=“line”,linestyle='-',marker='o',color=“orange”,
figsize=((24,12))
)
df.绘图(x=“年”,y=“全部”,
kind=“bar”,ax=ax,secondary\u y=True
)
ax.spines['top'].set_可见(假)
ax.spines['右'].set_可见(假)

下面的答案是从这个答案复制过来的

将熊猫作为pd导入
从matplotlib导入pyplot作为plt
数据={'Year':{0:'2016',1:'2017',2:'2018',3:'2019',4:'2020'},
'一些':{0:9,1:13,2:21,3:18,4:28},
'全部':{0:157,1:189,2:216,3:190,4:284},
‘比率’:{0:0.05732484076433121,
1: 0.06878306878306878,
2: 0.09722222222222222,
3: 0.09473684210526316,
4: 0.09859154929577464}}
df=pd.DataFrame(数据)
ax1=df.plot(x=“年”,y=“全部”,
kind=“bar”,
)
对于df.All.items()中的i,a:
ax1.text(i,a,str(a),ha='center',va='bottom',fontsize=18)
xlims=ax1.get_xlim()
ax2=测向图(x=“年”,y=“比率”,
kind=“line”,linestyle='-',marker='o',color=“orange”,ax=ax1,secondary_y=True,
figsize=((24,12))
)
ax2.set_xlim(xlims)#需要,因为直线图缩短了xlims
#ax1.get_legend()。将_bbox_设置为_锚((0.03,0.9,0.1,0.1))#loc='best'时的不可预测行为
#ax1.legend(loc='左上方')#在本例中,这将创建第二个图例
ax1.获取图例().删除()#删除位置不正确的图例
handles1,labels1=ax1.get_legend_handles_labels()
handles2,labels2=ax2.get_legend_handles_labels()
ax1.图例(handles=handles1+handles2,#创建新图例
标签=标签1+标签2,
loc='左上')
#ax1.yaxis.tick_right()#将ax1的Ytick放置在右侧
ax2.yaxis.tick_left()#将ax2的Ytick放置在左侧
ax2.set_ylabel('比率')
ax2.yaxis.set_label_position('左')
ax1.axes.yaxis.set_ticks([])#删除ticks
对于ax-in(ax1、ax2):
对于“顶部”、“右侧”中的位置:
ax.spines[where].set_可见(False)
plt.show()