Python 使用条带图绘制seaborn中带中线的点

Python 使用条带图绘制seaborn中带中线的点,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我在seaborn有以下情节: df = pandas.DataFrame({"sample": ["X", "X", "X", "Y", "Y", "Y"], "value": [0.2, 0.3, 0.4, 0.7, 0.75, 0.8], "rep": ["a", "b", "c", "a", "b", "c"]}) plt.figure() ax = sns.stripplot(x="sample

我在seaborn有以下情节:

df = pandas.DataFrame({"sample": ["X", "X", "X", "Y", "Y", "Y"],
                       "value": [0.2, 0.3, 0.4, 0.7, 0.75, 0.8],
                       "rep": ["a", "b", "c", "a", "b", "c"]})
plt.figure()
ax = sns.stripplot(x="sample", y="value", edgecolor="none",
                   hue="sample", palette="Set1", data=df)

# how to plot median line?
plt.show()
它以灰度颜色绘制点,而不是使用
Set1
,并且仅在图例中显示
X
,而不是
Y


我还想在中位数处为
X
Y
添加一条水平线。如何做到这一点<代码>工厂地块似乎没有水平线选项。

您可以使用matplolib绘制线。Pandas可能会计算数据集的中间值。我在本例中使用seaborn 0.7.0:

from pandas import DataFrame
import matplotlib.pyplot as plt
import seaborn as sns

df = DataFrame({"sample": ["X", "X", "X", "Y", "Y", "Y"],
                       "value": [0.2, 0.3, 0.4, 0.7, 0.75, 0.8],
                       "rep": ["a", "b", "c", "a", "b", "c"]})
# calc medians
xmed = df.loc[df["sample"] == 'X'].median()['value']
ymed = df.loc[df["sample"] == 'Y'].median()['value']

sns.stripplot(x="sample", y="value", edgecolor="none",
 hue="sample", palette="Set1", data=df)

x = plt.gca().axes.get_xlim()

# how to plot median line?
plt.plot(x, len(x) * [xmed], sns.xkcd_rgb["pale red"])
plt.plot(x, len(x) * [ymed], sns.xkcd_rgb["denim blue"])
plt.show()

我们可以在生成条带图后通过轴标记和标签循环,将每条中间线的宽度限制为其各自的列。这也使代码能够独立于要打印的样本数(列)进行操作


    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt

    df = pd.DataFrame({"sample": ["X", "X", "X", "Y", "Y", "Y"],
                       "value": [0.2, 0.3, 0.4, 0.7, 0.75, 0.8],
                       "rep": ["a", "b", "c", "a", "b", "c"]})

    ax = sns.stripplot(x="sample", y="value", data=df, palette="Set1", s=8)

    # distance across the "X" or "Y" stipplot column to span, in this case 40%
    median_width = 0.4

    for tick, text in zip(ax.get_xticks(), ax.get_xticklabels()):
        sample_name = text.get_text()  # "X" or "Y"

        # calculate the median value for all replicates of either X or Y
        median_val = df[df['sample']==sample_name].value.median()

        # plot horizontal lines across the column, centered on the tick
        ax.plot([tick-median_width/2, tick+median_width/2], [median_val, median_val],
                lw=4, color='k')

    plt.show()
绘制中间线的seaborn带状图:

什么版本的seaborn?灰度点不应出现在0.7中。根据您的示例,我得到错误,“AttributeError:'list'对象没有属性'Getxticks'”。你知道会出什么问题吗?@SummerEla-你在运行示例代码或对其进行修改时是否会遇到这种错误?我刚刚分别使用matplotlib和seaborn的版本3.3.1和0.10.1重试了这个示例,它在我这方面很有效。如果不知道更多,很难说,但由于某种原因,该错误意味着
ax
是一个列表,而不是一个matplotlib轴。您正在创建多个绘图吗?