как повернуть линейный участок морской линии - PullRequest
0 голосов
/ 30 января 2019

Как мне повернуть 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)

Создайте эту фигуру:

enter image description here

Но есть ли способ повернуть фигуру на 90 °?так что в X у нас будет «val», а в Y у нас будет «group», и std будет идти слева направо, а не снизу вверх.

Спасибо

РЕДАКТИРОВАТЬ: я открыл билет в Seaborn, чтобы попросить эту функцию: https://github.com/mwaskom/seaborn/issues/1661

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Подумайте, что бы вы сделали, если бы не использовали 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()

enter image description here

0 голосов
/ 30 января 2019

Для морских документов на lineplot кадр данных, передаваемый на data, должен быть

Tidy («длинная форма»), где каждый столбец представляет собойпеременная, и каждая строка является наблюдением.

Из этого следует, что нет способа заставить оси переключаться, даже манипулируя данными.Если есть способ сделать это, я не нашел его - я уверен, что есть более элегантный способ сделать это, но один из способов, которым вы могли бы это сделать, это сделать это, так сказать, вручную.Нечто подобное может сделать трюк

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)

Это даст вам следующий сюжет:

enter image description here

Для краткости используетсяминимум и максимум от каждой группы, чтобы получить полосу ошибок, но при необходимости ее можно легко заменить на стандартную ошибку или стандартное отклонение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...