【问题标题】:Plotting a bar chart with seaborn使用 seaborn 绘制条形图
【发布时间】:2021-07-28 00:49:31
【问题描述】:

我正在使用 seaborn 绘制以下值:

import pandas as pd
f = [0.31,0.75,0.75,0.75, 0.66,0.83,0.57, 0.69, 0.64,0.61, 0.81,0.21,0.71,0.71,0.64,0.55,0.72,0.74,0.73,0.77]
p = [0.53, 0.72,0.73,0.70,0.44,0.38,0.68,0.79,0.60,0.76, 0.76,0.32,0.84,0.79,0.80,0.38,0.77,0.86,0.81,0.79]
r = [0.74,0.54,0.63,0.61,0.41,0.83,0.63,0.67,0.63,0.53, 0.86,0.51,0.21,0.68,0.59,0.98,0.78,0.75,0.71,0.67]
a = [0.92,0.93,0.92,0.92,0.94,0.82,0.97,0.94,0.91,0.93, 0.97,0.91,0.94,0.93,0.94,0.71,0.93,0.91,0.85,0.94]
pp=['B','B','B','B','B','T','T','T','T','T','B','B','B','B','B','T','T','T','T','T']  
m=['N','L','S','G','Rt','N','L','S','G','Rt','N','L','S','G','Rt','N','L','S','G','Rt']
d=['yes','yes','yes','yes','yes','yes','yes','yes','yes','yes','no','no','no','no','no','no','no','no','no','no']

df = {'DD':d, 'PP': pp, 'M': m, 'P': p, 'R':r, 'F':f,'A':a}
df2= pd.DataFrame(data=df)
df2 = df.melt(['PP', 'M', 'D'])

情节的代码是

g = sns.catplot(
    data=df2,
    x='m',
    y='value',
    hue='PP',
    col='variable',
    col_wrap=2,
    col_order = ['P', 'R', 'F', 'A'],
    kind='bar',
     ci=None,
    facet_kws={'sharey': False, 'sharex': False},
height=8.)

d_col = df2['DD'][:8]
for ax in g.axes.flat:
    labels = ax.get_xticklabels()
    for i,l in enumerate(labels):
        tmp = l.get_text()
        labels[i] = tmp + '\n' + d_col[i]
        ax.set_xticklabels(labels)
sns.set_style(style='white')

然而情节似乎是错误的。另外,我看不到no 值,而只能看到yes。我的预期输出是

在绘图示例中,我为条形图使用了虚拟值。每个 m 应该同时包含 yes 和 no,并且每个子图都将重复此操作(仅出于示例目的留空)。

您能告诉我如何生成类似的输出吗?谢谢

【问题讨论】:

    标签: python matplotlib seaborn visualization


    【解决方案1】:

    您正在为每个“M”创建两个条(一个用于“PP”为“B”,一个用于“T”)。每个“DD”没有分隔条。 Seaborn 仅接受 hue 的一列。您可以将 'PP' 和 'DD' 列组合成一个新列并将其用于hue,从而为每个 'M' 生成 4 个条形。

    这是一个代码示例。此外,sns.catplot 似乎希望将 shareysharex 直接作为关键字(至少在当前版本 0.11.1 中)。

    from matplotlib import pyplot as plt
    import seaborn as sns
    import pandas as pd
    import numpy as np
    
    f = [0.31,0.75,0.75,0.75,0.66,0.83,0.57,0.69,0.64,0.61,0.81,0.21,0.71,0.71,0.64,0.55,0.72,0.74,0.73,0.77]
    p = [0.53,0.72,0.73,0.70,0.44,0.38,0.68,0.79,0.60,0.76,0.76,0.32,0.84,0.79,0.80,0.38,0.77,0.86,0.81,0.79]
    r = [0.74,0.54,0.63,0.61,0.41,0.83,0.63,0.67,0.63,0.53,0.86,0.51,0.21,0.68,0.59,0.98,0.78,0.75,0.71,0.67]
    a = [0.92,0.93,0.92,0.92,0.94,0.82,0.97,0.94,0.91,0.93,0.97,0.91,0.94,0.93,0.94,0.71,0.93,0.91,0.85,0.94]
    pp = ['B','B','B','B','B','T','T','T','T','T','B','B','B','B','B','T','T','T','T','T']
    m = ['N','L','S','G','Rt','N','L','S','G','Rt','N','L','S','G','Rt','N','L','S','G','Rt']
    d = ['yes','yes','yes','yes','yes','yes','yes','yes','yes','yes','no','no','no','no','no','no','no','no','no','no']
    
    df = {'DD': d, 'PP': pp, 'M': m, 'P': p, 'R': r, 'F': f, 'A': a}
    df1 = pd.DataFrame(data=df)
    df2 = df1.melt(['PP', 'M', 'DD'])
    df2['PP_DD'] = df2['PP'] + ', ' + df2['DD']
    
    sns.set_style(style='white')
    g = sns.catplot(
        data=df2,
        x='M',
        y='value',
        hue='PP_DD',
        col='variable',
        col_wrap=2,
        col_order=['P', 'R', 'F', 'A'],
        kind='bar',
        ci=None,
        sharey=False, sharex=False,
        height=3, aspect=1.5)
    g.fig.subplots_adjust(left=0.06, bottom=0.09)
    plt.show()
    

    【讨论】:

    • 谢谢 JohanC。您的回答显示了一个非常聪明的解决方案!
    猜你喜欢
    • 2019-05-29
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2021-05-04
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多