使用带状图在seaborn中用中线绘制点

mvd*_*mvd 3 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", y="value", edgecolor="none",
                   hue="sample", palette="Set1", data=df)

# how to plot median line?
plt.show()
Run Code Online (Sandbox Code Playgroud)

它以灰度颜色绘制点而不是使用Set1并且仅显示X在图例中而不是Y

秒

我也想在中位数增加一个水平线XY。如何才能做到这一点?factorplot似乎没有水平线选项。

小智 6

我们可以通过在生成带状图后循环 Axes 刻度和刻度标签来将每条中线的宽度限制为其各自的列。这也使代码能够独立于要绘制的样本(列)数量而运行。


    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 带状图