使用pandas双Y轴绘图时自定义X轴标签旋转45度无效的解决方法
解决Pandas绘图时X轴标签旋转不生效的问题
我尝试将X轴标签旋转45度,但运行以下代码后标签仍保持0度旋转,请问该如何解决?
df_final = pd.DataFrame({'Count':[8601,188497,808,7081,684,15601,75,12325], 'Average': [0.128,0.131,0.144,.184,.134,.152,0.139,0.127]}) width = 0.8 df_final['Count'].plot(kind='bar', width = width) df_final['Average'].plot(secondary_y=True) ax = plt.gca() ax.set_xticklabels(['One', 'Two', 'Three', 'Four', 'Five','Six','Seven','Eight'],rotation = 45) plt.show()
问题原因
你代码里的plt.gca()获取的是次y轴对应的轴对象(因为你用了secondary_y=True绘制第二个轴),这个轴的X标签默认隐藏,所以设置它的旋转参数不会影响到条形图的X轴标签。真正控制条形图X轴的是第一个轴(主y轴对应的轴)。
解决方案
方法1:保存主轴引用并设置
绘图时保存主条形图的轴对象,直接对它设置X轴标签:
import pandas as pd import matplotlib.pyplot as plt df_final = pd.DataFrame({'Count':[8601,188497,808,7081,684,15601,75,12325], 'Average': [0.128,0.131,0.144,.184,.134,.152,0.139,0.127]}) width = 0.8 # 保存主条形图的轴对象 ax_main = df_final['Count'].plot(kind='bar', width=width) # 基于主轴绘制次轴折线图 df_final['Average'].plot(secondary_y=True, ax=ax_main) # 对主轴设置X轴标签和旋转角度 ax_main.set_xticklabels(['One', 'Two', 'Three', 'Four', 'Five','Six','Seven','Eight'], rotation=45) plt.show()
方法2:直接用plt.xticks()设置
跳过轴对象的获取,直接用全局方法设置X轴标签和旋转:
import pandas as pd import matplotlib.pyplot as plt df_final = pd.DataFrame({'Count':[8601,188497,808,7081,684,15601,75,12325], 'Average': [0.128,0.131,0.144,.184,.134,.152,0.139,0.127]}) width = 0.8 df_final['Count'].plot(kind='bar', width=width) df_final['Average'].plot(secondary_y=True) # 直接设置X轴刻度的标签和旋转角度 plt.xticks(ticks=range(8), labels=['One', 'Two', 'Three', 'Four', 'Five','Six','Seven','Eight'], rotation=45) plt.show()
方法3:获取正确的轴对象
通过plt.gcf().axes[0]获取figure中的第一个轴(主X轴所在的轴):
import pandas as pd import matplotlib.pyplot as plt df_final = pd.DataFrame({'Count':[8601,188497,808,7081,684,15601,75,12325], 'Average': [0.128,0.131,0.144,.184,.134,.152,0.139,0.127]}) width = 0.8 df_final['Count'].plot(kind='bar', width=width) df_final['Average'].plot(secondary_y=True) # 获取主X轴所在的轴对象(figure的axes列表第一个元素) ax_main = plt.gcf().axes[0] ax_main.set_xticklabels(['One', 'Two', 'Three', 'Four', 'Five','Six','Seven','Eight'], rotation=45) plt.show()
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

