【问题标题】:Labelling jitters with specific marker using seaborn使用 seaborn 使用特定标记标记抖动
【发布时间】:2020-06-05 20:32:49
【问题描述】:

我有四个不同的label_list。如果每个label_list 的第二列和第三列的值相同,我想用一个特定的标记来标记那个点。 例如:

df = pd.DataFrame([['0', 0.3, 'gd','gd'],['0',0.2,'gf','gd'],['1',0.5,'gd','gd'],['1',0.1,'gf','gf'],['2', 0.9,'gd','gd'],['2', 0.1,'gf','gf'],
                   ['0', 0.8,'gd','gd'],['0',0.3,'gf','gf'],['1',0.3,'gd','gd'],['1',0.3,'gf','gf'],['2', 0.4,'gd','gf'],['2', 0.3,'gf','gf'],
                   ['0', 0.4,'gd','gf'],['0',0.4,'gf','gd'],['1',0.0,'gd','gf'],['1',0.9,'gf','gd'],['2', 0.7,'gd','gf'],['2', 0.4,'gf','gd']])

df.columns = ['label', 'score','hotel','hotel_1']

label_list = ['0', '1', '2','3']

fig = plt.figure(figsize=(8, 5))
g=sns.boxplot(x='label', y='score', data=df, hue='hotel',dodge =True)
g=sns.stripplot(x='label',y = 'score',data=df, hue='hotel_1',dodge =False)
g.legend_.remove()

plt.show()

【问题讨论】:

    标签: python plot seaborn


    【解决方案1】:

    您可以分两步绘制标记,一次在最后一列相等时,一次在它们不同时。由于默认标记可能太小,size 参数会很方便:

    import matplotlib.pyplot as plt
    import pandas as pd
    import seaborn as sns
    
    df = pd.DataFrame([['0', 0.3, 'gd', 'gd'], ['0', 0.2, 'gf', 'gd'], ['1', 0.5, 'gd', 'gd'], ['1', 0.1, 'gf', 'gf'], ['2', 0.9, 'gd', 'gd'], ['2', 0.1, 'gf', 'gf'],
                       ['0', 0.8, 'gd', 'gd'], ['0', 0.3, 'gf', 'gf'], ['1', 0.3, 'gd', 'gd'], ['1', 0.3, 'gf', 'gf'], ['2', 0.4, 'gd', 'gf'], ['2', 0.3, 'gf', 'gf'],
                       ['0', 0.4, 'gd', 'gf'], ['0', 0.4, 'gf', 'gd'], ['1', 0.0, 'gd', 'gf'], ['1', 0.9, 'gf', 'gd'], ['2', 0.7, 'gd', 'gf'], ['2', 0.4, 'gf', 'gd']])
    
    df.columns = ['label', 'score', 'hotel', 'hotel_1']
    
    label_list = ['0', '1', '2', '3']
    fig = plt.figure(figsize=(8, 5))
    palette={'gd': 'steelblue', 'gf': 'darkorange'}
    g = sns.boxplot(x='label', y='score', data=df, hue='hotel', dodge=True, palette=palette)
    g = sns.stripplot(x='label', y='score', data=df[df['hotel'] == df['hotel_1']], hue='hotel_1',
                      dodge=False, marker='*', size=10, palette=palette)
    g = sns.stripplot(x='label', y='score', data=df[df['hotel'] != df['hotel_1']], hue='hotel_1',
                      dodge=False, marker='D', size=7, palette=palette)
    
    g.legend_.remove()
    
    plt.show()
    

    PS:为stripplots 设置dodge=True 并更改hue_order

    palette={'gd': 'steelblue', 'gf': 'darkorange'}
    g = sns.boxplot(x='label', y='score', data=df, hue='hotel', dodge=True, palette=palette, hue_order=['gd', 'gf'])
    g = sns.stripplot(x='label', y='score', data=df[df['hotel'] == df['hotel_1']], hue='hotel_1', hue_order=['gf', 'gd'],
                      dodge=True, marker='*', size=10, palette=palette)
    g = sns.stripplot(x='label', y='score', data=df[df['hotel'] != df['hotel_1']], hue='hotel_1', hue_order=['gf', 'gd'],
                      dodge=True, marker='D', size=7, palette=palette)
    

    【讨论】:

    • 您好,我尝试采纳您的建议。我遇到了一个问题。来自一个label 的值绘制在另一个label 上。例如:来自gf 组的分数0.2 绘制在gd 组标签0 上。
    • 也许它有助于设置一个明确的调色板(如更新的答案)?还是设置dodge=True
    • 我尝试解决dodge = True。但问题依然存在。
    • 你能用一个非常具体的例子来说明你想要什么不同的地方吗? label=0score=0.2 的蓝色钻石,你想要它在哪里?你想要hue='hotel' 作为第一个stripplot(而不是hue='hotel_1'
    • 在您添加的情节中,对于label = 00.8 处的蓝星属于蓝条,但它显示在橙色条的顶部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2018-01-30
    • 2019-12-16
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多