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

Python 如何使用希腊符号替换matplotlib条形图中主轴和次轴的图例标签?,python,pandas,matplotlib,plot,legend,Python,Pandas,Matplotlib,Plot,Legend,我有一个由6列组成的数据框,我想将其绘制为条形图。 最后3列位于次轴上的。绘图上显示的默认图例是列名。但是我需要把图例改成希腊符号。为此,我面临两个问题: 当我使用plt.legend添加新的图例名称时,它会添加一个新的图例,而不是更改现有的图例框 当我尝试更改所有图例时,它只更改次轴上的图例(最后3列数据),而不更改绘制在左轴上的数据 有没有办法解决这些问题 此外,如何使用均匀间距(或指定间距,如果可能)和y轴字体大小和重量来指定左右y轴限制 下面是一个示例代码: import pandas

我有一个由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
    绘制结果如下:

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


    谢谢你的帮助

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

    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}$'])
    
    输出:


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

    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}$'])
    
    输出:


    谢谢@广黄:你知道如何为每个y轴(主轴和次轴)设置y限制吗?当我使用'plt.gca().set_ylim([0,6])时,它只为右边的次轴设置了限制,而没有为左边的主轴设置限制。我刚刚修复了它。我对左y轴使用了“ax1.set_ylim([0,1]),对右y轴使用了“ax1.right_ax.set_ylim([0,5])。您知道如何使用指定的间距和y轴刻度字体大小和重量来指定左y轴和右y轴限制吗?谢谢@广黄:你知道如何为每个y轴(主轴和次轴)设置y限制吗?当我使用'plt.gca().set_ylim([0,6])时,它只为右边的次轴设置了限制,而没有为左边的主轴设置限制。我刚刚修复了它。我对左y轴使用了“ax1.set_ylim([0,1]),对右y轴使用了ax1.right_ax.set_ylim([0,5])。您知道如何使用指定的间距和y轴刻度字体大小和重量来指定左y轴和右y轴限制吗?