[英]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.