在Seaborn Stripplot中添加色相类别标签

时间:2019-03-05 18:54:36

标签: python pandas matplotlib seaborn

我有两个要绘制为带状图的DataFrame。我可以按照自己的意愿绘制它们,但是我想知道是否可以为“色相”添加类别标签。

该图当前如下所示:

Example plot.

但是,我想将类别的标签(只有两个)添加到每个字母的每个“列”中。这样看起来像这样:

enter image description here

DataFrames看起来像这样(尽管它们只是经过编辑的片段):

     Case Letter Size Weight
0   upper      A   20   bold
1   upper      A   23   bold
2   lower      A   61   bold
3   lower      A   62   bold
4   upper      A   78   bold
5   upper      A   95   bold
6   upper      B   23   bold
7   upper      B   40   bold
8   lower      B   47   bold
9   upper      B   59   bold
10  upper      B   61   bold
11  upper      B   99   bold
12  lower      C   23   bold
13  upper      D   23   bold
14  upper      D   66   bold
15  lower      D   99   bold
16  upper      E    5   bold
17  upper      E   20   bold
18  upper      E   21   bold
19  upper      E   22   bold

...和...

     Case Letter Size  Weight
0   upper      A    4  normal
1   upper      A    6  normal
2   upper      A    7  normal
3   upper      A    8  normal
4   upper      A    9  normal
5   upper      A   12  normal
6   upper      A   25  normal
7   upper      A   26  normal
8   upper      A   38  normal
9   upper      A   42  normal
10  lower      A   43  normal
11  lower      A   57  normal
12  lower      A   90  normal
13  upper      B    4  normal
14  lower      B    6  normal
15  upper      B    8  normal
16  upper      B    9  normal
17  upper      B   12  normal
18  upper      B   21  normal
19  lower      B   25  normal

我拥有的相关代码是:

fig, ax = plt.subplots(figsize=(10, 7.5))
plt.tight_layout()

sns.stripplot(x=new_df_normal['Letter'], y=new_df_normal['Size'], 
              hue=new_df_normal['Case'], jitter=False, dodge=True, 
              size=8, ax=ax, marker='D',
              palette={'upper': 'red', 'lower': 'red'})

plt.setp(ax.get_legend().get_texts(), fontsize='16') # for legend text
plt.setp(ax.get_legend().get_title(), fontsize='18') # for legend title

ax.set_xlabel("Letter", fontsize=20)
ax.set_ylabel("Size", fontsize=20)
ax.set_ylim(0, 105)
ax.tick_params(labelsize=20)

ax2 = ax.twinx()

sns.stripplot(x=new_df_bold['Letter'], y=new_df_bold['Size'], 
              hue=new_df_bold['Case'], jitter=False, dodge=True, 
              size=8, ax=ax2, marker='D',
              palette={'upper': 'green', 'lower': 'green'})

ax.legend_.remove()
ax2.legend_.remove()

ax2.set_xlabel("", fontsize=20)
ax2.set_ylabel("", fontsize=20)
ax2.set_ylim(0, 105)
ax2.tick_params(labelsize=20)

是否可以为每一列添加那些类别标签(“粗体”和“普通”)?

1 个答案:

答案 0 :(得分:1)

使用seaborn的散点图,您可以访问class Box(): def __init__(self, width=5, length=5): self.width = width self.height = length def print_box(): for i in range(width): for j in range(length): if(i == 0 or i == width - 1 or j == 0 or j == length - 1): print('*', end = ' ') else: print(' ', end = ' ') >>> mybox = Box() >>> mybox.print_box (甚至是style)参数。但是,您最终可能不会得到预期的布局。 scatterplot documentation

或者您可以使用size来处理行和列。 seaborn doc for catplot

不幸的是,Seaborn本身并没有提供您所需要的内容:catplothue参数之外的另一层嵌套(请参阅stripplot documentation。打开了一些可能与,例如this ticket。但是我已经在Seaborn中提出了一些类似的功能请求,但这些请求被拒绝了,请参见this ticket

最后一种可能性是潜入matplotlib原语来操纵您的seaborn图(因为seaborn刚好在matplotlib之上)。不用说,这将需要大量的努力,并且可能最终使seaborn无效;)