如何在 matplotlib 条形图中用希腊符号替换主轴和次轴的图例标签?

Posted

技术标签:

【中文标题】如何在 matplotlib 条形图中用希腊符号替换主轴和次轴的图例标签?【英文标题】:How to replace legend labels with Greek symbols for primary and secondary axis in a matplotlib bar plot? 【发布时间】:2021-02-16 06:11:58 【问题描述】:

我有一个包含 6 列的数据框,我想将其绘制为条形图。 最后 3 列位于辅助轴上。图中出现的默认图例是列名。但我需要将传说改为希腊符号。尝试这样做时,我遇到了两个问题:

    当我使用 plt.legend 添加新的图例名称时,它不会更改现有的图例框,而是添加一个新的图例框。 当我尝试更改所有图例时,它只会更改次轴上的图例(最后 3 列数据),而不会更改左轴上绘制的数据。

有没有办法解决这些问题?

此外,如何以均匀间距(或指定间距,如果可能)和 y 轴刻度字体大小和粗细来指定左右 y 轴限制?

这是一个示例代码:

import pandas as pd 
import matplotlib.pyplot as plt


# To set plotting style
plotStyleDict = 'axes.titlesize' : 18,
'axes.titleweight' :'bold',
'axes.labelsize' : 15,
'lines.linewidth' : 3,
'lines.markersize' : 10,
'xtick.labelsize' : 12,
'ytick.labelsize' : 12

plt.style.use(plotStyleDict)

# data dictionary
dataDict = 'Year': ['1st Year','2st Year','3rd Year','4th Year'],
            'ERRh': [0, 0.71, 0.46, 0.35],
            'HRRh': [0.0, 0.66, 0.33, 0.14],
            'EREh': [0.0, 0.38, 0.20, 0.11],
            'ERRc': [1.2, 1.62, 2.04, 0.04],
            'EREc': [1.5, 1.4, 1.3, 1.1],
            'HRRc': [1.36, 2.27, 4.83, 0.09]

# create dataframe
dfDataTest=pd.DataFrame.from_dict(dataDict, orient='columns', dtype=None, columns=None)
dfDataTest.index = dfDataTest.Year
dfDataTest.drop('Year', inplace = True, axis=1)
print(dfDataTest)


# Bar plot  the dataframe with last 3 columns being on secondary axis
ax1 = dfDataTest [['ERRh', 'HRRh','EREh','ERRc', 'EREc', 'HRRc']].\
                              plot(kind='bar',color=['green','darkgreen','orange','blue','red','firebrick'], 
                              figsize=(16,6), edgecolor=['black','black','black','black','black','black'],
                              stacked=False, secondary_y= ['ERRc', 'EREc', 'HRRc'])

plt.xticks(rotation=30, horizontalalignment="center")
plt.title("Energy & Hydraulic Recoveries for Heating and Cooling",fontsize=18, weight='bold')

# specify left and right y labels with Greek symbols
ax1.set_ylabel(r'$\eta_ER,h , \eta_HR,h  , \eta_th,h   [-]$')
ax1.right_ax.set_ylabel(r'$\eta_ER,c , \eta_HR,c  , \eta_th,c  [-]$')

# change legends to Greek symbols
plt.legend([r'$\eta_ER,h$', r'$\eta_HR,h$', r'$\eta_th,h$',r'$\eta_ER,c$',
            r'$\eta_HR,c$',r'$\eta_th,c$'],loc=2)


plt.grid(True)
    
plt.show()

使用plt.legend之前的绘图结果如下:

使用plt.legend绘图结果如下:

我希望只有一个图例框(最好是右上角的那个),所有图例都替换为希腊符号。

感谢帮助!

【问题讨论】:

【参考方案1】:

如果在绘图之前重命名数据框会更容易:

orig_cols = ['ERRh', 'HRRh','EREh','ERRc', 'EREc', 'HRRc']
rename_cols = [r'$\eta_ER,h$', r'$\eta_HR,h$', r'$\eta_th,h$',r'$\eta_ER,c$',
             r'$\eta_HR,c$',r'$\eta_th,c$']
rename_dict = dict(zip(orig_cols, rename_cols))
# Bar plot  the dataframe with last 3 columns being on secondary axis
ax1 = dfDataTest [orig_cols].rename(columns=rename_dict).\
                              plot(kind='bar',color=['green','darkgreen','orange','blue','red','firebrick'], 
                              figsize=(16,6), edgecolor=['black','black','black','black','black','black'],
                              stacked=False, secondary_y= [r'$\eta_ER,c$',
             r'$\eta_HR,c$',r'$\eta_th,c$'])

输出:

【讨论】:

谢谢!! @Quang Hoang 你知道如何为每个 y 轴(主要和次要)设置 y 限制吗?当我使用 'plt.gca().set_ylim([0,6])' 时,它只设置了右侧辅助轴的限制,而不是左侧的主轴。 我刚刚修好了。我使用 "ax1.set_ylim([0, 1])" 作为左 y 轴,使用 ax1.right_ax.set_ylim([0, 5]) 作为右 y 轴。 你知道如何在指定间距和 y 轴刻度字体大小和粗细的情况下同时指定左右 y 轴限制吗?

以上是关于如何在 matplotlib 条形图中用希腊符号替换主轴和次轴的图例标签?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib条形图中如何开启科学计数法?

如何在 matplotlib pandas 的一张图中组合两个文件的两个条形图

我可以在 matplotlib 条形图中关闭科学记数法吗?

Matplotlib 保存为 pdf 在条形图中未显示影线标记 - 潜在错误?

Matplotlib 在一张图中绘制多个条形图

Matplotlib 在一张图中绘制多个条形图