簡體   English   中英

多個 Y 軸,多個桿上帶有脊椎 Plot

[英]Multiple Y-axes with Spines on Multiple Bar Plot

我有一些數據想在多個 Y 軸條 plot 上表示。 目前,我只能在 plot 線上表示它們,如圖 1 所示。

圖 1:當前線圖

下面是我的代碼:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

def make_patch_spines_invisible(ax):
    ax.set_frame_on(True)
    ax.patch.set_visible(False)
    for sp in ax.spines.values():
        sp.set_visible(False)

dataset = pd.read_csv('Model Selection (Humidity)_csv.csv')

feature1 = dataset.iloc[:5, 2].values
feature2 = dataset.iloc[:5, 3].values
feature3 = dataset.iloc[:5, 4].values
feature4 = dataset.iloc[:5, 5].values
xaxis = dataset.iloc[:5,1].values

fig, f1 = plt.subplots(figsize= (25,15))
fig.subplots_adjust(right=0.75)

f2 = f1.twinx()
f3 = f1.twinx()
f4 = f1.twinx()

# Offset the right spine of par2.  The ticks and label have already been
# placed on the right by twinx above.
f3.spines["right"].set_position(("axes", 1.1))
f4.spines["left"].set_position(("axes", -0.1))

# Having been created by twinx, par2 has its frame off, so the line of its
# detached spine is invisible.  First, activate the frame but make the patch
# and spines invisible.
make_patch_spines_invisible(f3)
make_patch_spines_invisible(f4)

# Second, show the right spine.
f3.spines["right"].set_visible(True)
f4.spines["left"].set_visible(True)
f4.yaxis.set_label_position('left')
f4.yaxis.set_ticks_position('left')

p1, = f1.plot(xaxis, feature1, 'r-', label="Adjusted R2")
p2, = f2.plot(xaxis, feature2, 'g-', label="Max Absolute Error")
p3, = f3.plot(xaxis, feature3, 'b-', label="Max Error")
p4, = f4.plot(xaxis, feature4, 'y-', label="Root Mean Square Error")

f1.set_ylim(0, 1)
f2.set_ylim(0, 2)
f3.set_ylim(7, 25)
f4.set_ylim(1, 3)

f1.set_xlabel("Model")
f1.set_ylabel("Adjusted R2")
f2.set_ylabel("Max Absolute Error")
f3.set_ylabel("Max Error")
f4.set_ylabel("Root Mean Square Error")

f1.yaxis.label.set_color(p1.get_color())
f2.yaxis.label.set_color(p2.get_color())
f3.yaxis.label.set_color(p3.get_color())
f4.yaxis.label.set_color(p4.get_color())

tkw = dict(size=4, width=1.5)
f1.tick_params(axis='y', colors=p1.get_color(), **tkw)
f2.tick_params(axis='y', colors=p2.get_color(), **tkw)
f3.tick_params(axis='y', colors=p3.get_color(), **tkw)
f4.tick_params(axis='y', colors=p4.get_color(), **tkw)
f1.tick_params(axis='x', **tkw)

lines = [p1, p2, p3, p4]

f1.legend(lines, [l.get_label() for l in lines])

plt.show()

我想實現類似於下面圖 2 的效果,但有多個 Y 軸,每個 Y 軸對應於它們各自的彩色條。 感謝我能得到的任何幫助。 謝謝!

圖 2:多條 Plot 示例

  • The issue stems from the way the matplotlib api returns different objects depending on the type of plot (eg plot & bar have different returns).
  • 線數據可能是使用Multiple Yaxis With Spines繪制的,這不適用於bar
  • 我給你兩個選擇:
    1. Plot 一個 y 軸的條形,然后將其設置為對數刻度以補償值范圍的變化
    2. Plot 使用輔助 y 軸將條形圖設置為對數刻度。
  • 將數據保留在 dataframe 中,以使繪圖更容易。

設置 dataframe

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# test data
np.random.seed(10)
rows = 5
feature1 = np.random.randint(10, size=(rows,)) / 10
feature2 = np.random.randint(20, size=(rows,)) / 10
feature3 = np.random.randint(8, 25, size=(rows,))
feature4 = np.random.randint(1, 3, size=(rows,))
xaxis = range(rows)

# create dataframe
df = pd.DataFrame({'Adj. R2': feature1, 'Max Abs. Error': feature2, 'Max Error': feature3, 'RMS Error': feature4},
                  index=['SVR', 'DTR', 'RFR', 'PR', 'MLR'])

# display(df)
     Adj. R2  Max Abs. Error  Max Error  RMS Error
SVR      0.9             1.6         18          2
DTR      0.4             1.7         16          2
RFR      0.0             0.8         12          1
PR       0.1             0.9         24          1
MLR      0.9             0.0         12          2

繪圖

secondary_y

ax = df.plot(secondary_y=['Max Error', 'RMS Error'], kind='bar')
ax.right_ax.set_yscale('log')
plt.show()

在此處輸入圖像描述

單 y 軸

df.plot(kind='bar', logy=True)
plt.show()

在此處輸入圖像描述

暫無
暫無

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

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