簡體   English   中英

如何旋轉seaborn線圖

[英]how to rotate a seaborn lineplot

如何旋轉seaborn.lineplot以便結果將是y的函數,而不是x的函數。

例如,此代碼:

import pandas as pd
import seaborn as sns
df = pd.DataFrame([[0,1],[0,2],[0,1.5],[1,1],[1,5]], columns=['group','val'])
sns.lineplot(x='group',y='val',data=df)

創建此圖:

在此處輸入圖片說明

但是是否可以將圖形旋轉90°? 因此,在X中,我們將具有“ val”,在Y中,我們將具有“ group”,並且std從左到右而不是從下到上。

謝謝

編輯:我已經在seaborn打開了一張票,要求此功能: https : //github.com/mwaskom/seaborn/issues/1661

根據lineplot上的seaborn文檔 ,傳遞給data的數據lineplot必須為

整齊(“長格式”)數據幀,其中每一列都是變量,每一行都是觀察值。

這似乎暗示即使通過操作數據也無法強迫軸切換。 如果有一種方法,我還沒有找到它-我敢肯定,有一種更優雅的方法可以做到這一點,但是可以做到的一種方法是手工完成。 這樣的事情可以解決問題

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
df = pd.DataFrame([[0,1],[0,2],[0,1.5],[1,1],[1,5]], columns=['group','val'])
group = df['group'].tolist()
val = df['val'].tolist()
yl = list()
yu = list()
avg = list()
ii = 0
while ii < len(group):   #Loop through all the groups
    g = group[ii]
    y0 = val[ii]
    y1 = val[ii]
    s = 0
    jj = ii
    while (jj < len(group) and group[jj] == g):
        s += val[jj]
        #This takes the min and max, but could easily take the standard deviation
        if val[jj] > y1:
            y1 = val[jj]
        if val[jj] < y0:
            y0 = val[jj]
        jj += 1
    avg.append(s/(jj - ii))
    ii = jj
    yl.append(y0)
    yu.append(y1)

x = np.linspace(min(group), max(group), len(yl))
plt.ylabel(df.columns[0])
plt.xlabel(df.columns[1])
plt.plot(avg, x, color="#5a9edd", linestyle="-", linewidth=1.5)
plt.fill_betweenx(x, yl, yu, alpha=0.3)

這將為您提供以下情節:

在此處輸入圖片說明

為簡便起見,它使用每個組的最小值和最大值給出誤差帶,但是可以根據需要輕松更改為標准誤差或標准偏差。

考慮一下如果不使用seaborn,該怎么辦。 您將計算平均值和標准偏差,並將其作為組的函數進行繪制。 現在很直接地將x和y交換為plot(x,y)plot(y,x) 對於填充區域,可以使用fill_betweenx而不是fill_between

下面對兩種情況進行比較。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([[0,1],[0,2],[0,1.5],[1,1],[1,5]], columns=['group','val'])

mean = df.groupby("group").mean()
std = df.groupby("group").std()

fig, (ax, ax2) = plt.subplots(ncols=2)

ax.plot(mean.index, mean["val"].values)
ax.fill_between(mean.index, (mean-std)["val"].values, (mean+std)["val"].values, alpha=.5)
ax.set(xlabel="group", ylabel="val")

ax2.plot(mean["val"].values, mean.index)
ax2.fill_betweenx(mean.index, (mean-std)["val"].values, (mean+std)["val"].values, alpha=.5)
ax2.set(ylabel="group", xlabel="val")

fig.tight_layout()
plt.show()

在此處輸入圖片說明

暫無
暫無

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

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