簡體   English   中英

如何在matplotlib中向條形圖添加多個Y軸?

[英]How to add multiple Y-Axis to bar plot in matplotlib?

我有一個 6 列的數據框,我想將其繪制為條形圖。 最后 3 列位於輔助軸上。 最后 3 列中的一列具有比其他兩列高得多的值,我想添加第三個 Y 軸以使用適當的比例繪制它。 在下面的代碼示例中,我設法添加了一個輔助 Y 軸。 但是我找不到添加額外(第三個)Y 軸的方法。

這是一個示例代碼:

# %config IPCompleter.greedy=True
import pandas as pd 
import matplotlib.pyplot as plt


# Set the plotting settings 
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)

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],
            'HRRc': [1.36, 2.27, 4.83, 0.09],
            'EREc': [150, 120, 90, 70]}

# Create a dataframe
dfDataTest=pd.DataFrame.from_dict(dataDict, orient='columns', dtype=None, columns=None)
# Set Year column as index
dfDataTest.index = dfDataTest.Year 
# delete Year column
dfDataTest.drop('Year', inplace = True, axis=1) 


# To rename df columns with Greek symbols to be easier to show them as legends on the plot
orig_cols = ['ERRh', 'HRRh','EREh','ERRc', 'HRRc', 'EREc']
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
ax1FunEnergy = dfDataTest [orig_cols].rename(columns=rename_dict).\
                              plot(kind='bar',color=['firebrick','red', 'darksalmon','darkblue','blue','royalblue'], 
                              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}$'])


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

ax1FunEnergy.set_ylabel(r'$\eta_{ER,h} , \eta_{HR,h}  , \eta_{th,h}   [-]$')
ax1FunEnergy.right_ax.set_ylabel(r'$\eta_{ER,c} , \eta_{HR,c}  , \eta_{th,c}  [-]$')

plt.grid(True)
    
plt.show()

這導致以下情節:

在此處輸入圖片說明

與其他列相比,最后一列比例太大。 因此,繪制在輔助 Y 軸上的其他兩列幾乎不可見。 所以我的問題如下:

  1. 有沒有辦法在條形圖中添加一個額外的(第三個)Y 軸來繪制最后一列?
  2. 如果可能,如何將最后一列名稱從第二個 Y 軸標簽移動到第三個 Y 軸標簽,同時保留其他繪圖設置,如條形顏色、邊緣等?
  3. 如何指定所有 Y 軸限制和 y 軸刻度字體大小和粗細?

提前致謝! :)

對於熊貓圖,復雜的圖很難創建,所以我用通用的matplotlib創建了一個圖來添加第三個軸。

import numpy as np
fig,ax = plt.subplots(figsize=(16,6))

labels = dfDataTest.index.tolist()

x = np.arange(len(labels))

ax2 = ax.twinx()
ax3 = ax.twinx()

ax.set_xlim(-0.5, 4)
ax.set_ylim(0, 1)
ax2.set_ylim(0, 5)
ax3.set_ylim(0,160)

ax.set_xlabel('Year')
ax.set_ylabel(r'$\eta_{ER,h} , \eta_{HR,h}  , \eta_{th,h}   [-]$', size=18)
ax2.set_ylabel(r'$\eta_{ER,h} , \eta_{HR,h}  , \eta_{th,h}   [-]$', size=18)
ax3.set_ylabel(r'$\eta_{ER,c} , \eta_{HR,c}  , \eta_{th,c}  [-]$', size=18)

color=['firebrick','red','darksalmon','darkblue','blue','royalblue']
width = 0.1
p1 = ax.bar(x-(width*3), dfDataTest['ERRh'], width=width, color=color[0], align='center', label=r'$\eta_{ER,h}$')
p2 = ax.bar(x-(width*2), dfDataTest['HRRh'], width=width, color=color[1], align='center', label=r'$\eta_{ER,h}$')
p3 = ax.bar(x-width, dfDataTest['EREh'], width=width, color=color[2], align='center', label=r'$\eta_{ER,h}$')
p4 = ax2.bar(x, dfDataTest['ERRc'], width=width, color=color[3], align='center', label=r'$\eta_{HR,h}, \eta_{th,h}$')
p5 = ax2.bar(x+(width*1), dfDataTest['HRRc'], width=width, color=color[4], align='center', label=r'$\eta_{HR,h}, \eta_{th,h}$')
p6 = ax3.bar(x+(width*2), dfDataTest['EREc'], width=width, color=color[5], align='center', label=r'$\eta_{ER,c} , \eta_{HR,c}$')

lns = [p1,p2,p3,p4,p5,p6]
ax.legend(handles=lns, loc='best')

ax3.spines['right'].set_position(('outward', 60))  
ax3.xaxis.set_ticks([])

ax.set_xticks(x)
ax.set_xticklabels(labels)

ax.set_title("Energy & Hydraulic Recoveries for Heating and Cooling",fontsize=18, weight='bold')
ax3.set_ylabel(r'$\eta_{ER,c} , \eta_{HR,c}  , \eta_{th,c}  [-]$')
fig.show()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM