我正在嘗試繪制雙 x 軸 seaborn 線圖,但基于以下代碼的輸出顯示兩個 x 軸都卡在角落中,而不是將值彼此對齊。
我錯過了什么?
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
plt.style.use("fivethirtyeight")
fig, ax = plt.subplots(1,1,figsize=(10,10))
ax2 = ax.twinx()
sns.lineplot(x="BUCKET_SEGMENT_1", y= 'Percentage to Bucket Total', data=df, ax=ax)
sns.lineplot(x="PAST_DUE_DAYS", y= 'Percentage to Bucket Total',data=df, ax=ax2)
plt.show()

資料
BUCKET_SEGMENT_1 PAST_DUE_DAYS BAL Percentage to Bucket Total
0 Bucket1 3.0 878698.045 74.431434
1 Bucket1 4.0 25747.397 2.180971
2 Bucket2 6.0 171683.523 14.54271
3 Bucket2 7.0 55659.448 4.714716
4 Bucket3 8.0 1589.759 0.134662
這是我希望看到的示例

我也嘗試使用 ax 和 ax2 設定限制和 xticks 但走不遠
DF = df.copy()
DF.set_index("BUCKET_SEGMENT_1",inplace=True)
fig, ax = plt.subplots(1,1,figsize=(10,10))
ax2 = ax.twinx()
sns.lineplot(data=DF,x="PAST_DUE_DAYS",y='Percentage to Bucket Total',ax=ax)
sns.lineplot(data=DF.reset_index(),x='BUCKET_SEGMENT_1',y='Percentage to Bucket Total',ax=ax2)
x = int(max(DF.PAST_DUE_DAYS))
ax.set_xlim(0,x)
ax2.set_xticks(DF.index.unique())
uj5u.com熱心網友回復:
為了找出發生了什么,它有助于首先在單獨的子圖中繪制兩個圖:
import matplotlib.pyplot as plt
import pandas as pd
from io import StringIO
df_str = '''BUCKET_SEGMENT_1 PAST_DUE_DAYS BAL "Percentage to Bucket Total"
0 Bucket1 3.0 878698.045 74.431434
1 Bucket1 4.0 25747.397 2.180971
2 Bucket2 6.0 171683.523 14.54271
3 Bucket2 7.0 55659.448 4.714716
4 Bucket3 8.0 1589.759 0.134662'''
df = pd.read_csv(StringIO(df_str), delim_whitespace=True)
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(14, 5))
sns.lineplot(x="BUCKET_SEGMENT_1", y='Percentage to Bucket Total', data=df, ax=ax1)
sns.lineplot(x="PAST_DUE_DAYS", y='Percentage to Bucket Total', data=df, ax=ax2)
ax2.set_xticks(df["PAST_DUE_DAYS"])
plt.tight_layout()
plt.show()

左子圖使用 x 軸的分類桶名稱。所有百分比均取平均值,并顯示誤差帶。Bucket1,Bucket2和Bucket3, 位于內部位置0,1和2。
右子圖使用PAST_DUE_DAYSx 軸的數字位置。每天只有一個百分比值,因此不需要誤差帶。
ax.twinx()將共享 x 軸。這會將第一個子圖位置 (0,1,2) 與第二個子圖的數字位置 (3,4,6,7,8) 混合。結果是您看到的奇怪圖(顯然來自不同的資料幀作為示例)。
現在,要將桶標記到數字圖中,您可以使用groupby()找出位置。使用最短和最長天數,可以定位文本。此外,交替的彩色帶可以可視化范圍。
以下是一些示例代碼,可幫助您入門:
fig, ax = plt.subplots(figsize=(10, 5))
sns.lineplot(x="PAST_DUE_DAYS", y='Percentage to Bucket Total', data=df, ax=ax)
colors = ['red', 'green']
previous_max_days = 0
for (group_name, group_data), color in zip(df.groupby("BUCKET_SEGMENT_1"), colors * len(df)):
# min_days = group_data['PAST_DUE_DAYS'].min() - 0.5
min_days = previous_max_days
max_days = group_data['PAST_DUE_DAYS'].max() 0.5
ax.axvspan(min_days, max_days, color=color, alpha=0.1)
ax.text((min_days max_days) / 2, 0.9, group_name, ha='center', fontsize=20, color=color,
transform=ax.get_xaxis_transform())
previous_max_days = max_days
plt.show()

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/363524.html
標籤:Python matplotlib 海生
