如何在不同的 seaborn 图中匹配调色板?

Posted

技术标签:

【中文标题】如何在不同的 seaborn 图中匹配调色板?【英文标题】:How can I match color palettes across different seaborn plots? 【发布时间】:2022-01-19 22:16:10 【问题描述】:

我想制作一个饼图和一个条形图(displot),它们在两个图中使用相同的颜色标签,但我不知道该怎么做。

temp_df = pd.DataFrame([['d7d1b050-0e48-4c00-8061-c78817155b72',
  '42773088-e38f-4578-bc2a-69d1797a90eb',
  11,
  'groupA'],
 ['962c397d-a8f8-4f1c-a589-ecf74a7da62d',
  'b5baafb0-f6d4-4b4e-bc76-1287614b985d',
  10,
  'groupA'],
 ['a90fde40-9b9f-466e-bd5e-a40325b5fc9d',
  'b3fba007-aef5-4a5f-a53b-94eb0705d953',
  11,
  'groupB'],
 ['22ebb056-603c-4f66-8240-8c54e8043509',
  'b780fa66-addd-48c0-8db4-d755ebd351b8',
  10,
  'groupC'],
 ['52ffd64c-a5c1-4cd5-89c8-c1dcb8bd24b2',
  '37482cb7-c354-4b4b-92b6-2aaa62811e5b',
  10,
  'groupA'],
 ['55524169-f159-4c31-b939-bb00e1cba804',
  '34a9ff63-ea75-473d-ab89-9a92c3f4a8d9',
  10,
  'groupB'],
 ['2027d9d0-1e29-4d1f-969a-995a47f12052',
  '875488ea-85a2-47cb-b1ea-62003bbce80a',
  10,
  'groupA'],
 ['10d9c9fb-b5dd-4581-b148-a6198abecec1',
  '3f4b0604-513a-424b-98a3-e788ab3daa97',
  11,
  'groupD'],
 ['1c1e183b-6459-41bd-99aa-5f89b375006a',
  '53dd2ffd-c9b0-49c3-9275-190716c78799',
  10,
  'groupB'],
 ['31030ded-64a7-4854-8042-585605141e71',
  'f0514527-2d7b-4cad-a36f-f21e3425093c',
  10,
  'groupD'],
 ['cdfd5a0c-dd8c-4546-ba31-c2f021fb4859',
  '1ed007fe-d4f7-41bc-8f3c-b163c57f8a1f',
  11,
  'groupE'],
 ['66bd16a5-b514-4d8a-ad7a-afb8921f7dd2',
  'a2e9f137-bba5-46ec-8b13-7b17821de735',
  10,
  'groupB'],
 ['3cdb21d9-be3c-4723-bf28-0a7769d492b4',
  '9a6f1516-54a0-4dda-83d7-e05311e87ff5',
  10,
  'groupE'],
 ['d25f4cb2-3bf7-4898-a8a3-91d9e1b58576',
  '716a7732-6bcd-478d-87f9-c13cd83eaf66',
  11,
  'groupA'],
 ['e95134fd-7ce2-4e88-808c-e5abf13a4892',
  'c021c21b-7bab-4e1f-9ff0-4dfc584263b8',
  11,
  'groupE'],
 ['e13da005-1033-466f-b984-48fdfa0988f2',
  '5bcc0651-0775-4fa5-b521-ac90e0a33b1c',
  10,
  'groupB'],
 ['b60ee53d-e4fc-4e37-aa1c-df67f66e304e',
  '592adca4-6fa6-48c3-be97-2357250d736d',
  10,
  'groupD'],
 ['c1d47246-838f-418a-a92d-7b5150122775',
  'ff5d180c-cca9-474a-974e-e18c35cab912',
  10,
  'groupA'],
 ['fc129686-f7cd-407a-aca3-68f86c52af41',
  'a18dfc3a-2ce6-43f7-a21f-4c7371cff2b6',
  11,
  'groupE'],
 ['191af645-cb9e-408a-af2e-b6826f7177b9',
  'd430610b-b7da-42cb-aa93-c7f94774093c',
  10,
  'groupA']])

temp_df.columns = ['clickId', 'sessionId', 'month','group']

temp_df.groupby(['group']).agg('sessionId':'count').plot.pie(y='sessionId');

sns.displot(data=temp_df[['sessionId', 'month', 'group']].drop_duplicates(), x='date', hue='group',  stat='count', multiple="stack")

这两个图将使用不同的调色板,我希望组内的每个级别的显示图和饼图都具有相同的颜色。

知道我会怎么做吗?

【问题讨论】:

这段代码没有运行 由于您的代码当前正在编写最后一行sns.displot throws ValueError: Could not interpret value `date` for parameter `x` 【参考方案1】:

您可以在这两种情况下使用相同的颜色 (plt.cm.tab10)。您可能希望将 alpha 设置为 1。请注意,直方图需要 discrete=True

为了确保在任何地方都使用相同的顺序,可以使用temp_df['group'] = pd.Categorical(temp_df['group'])。或者 temp_df['group'] = pd.Categorical(temp_df['group'], ['groupA', 'groupB', 'groupC', 'groupD', 'groupE']) 如果确切的顺序很重要。默认情况下,使用数据帧(或子集)中的出现顺序。

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
import seaborn as sns
import pandas as pd
import numpy as np

temp_df = pd.DataFrame([
    ['d7d1b050-0e48-4c00-8061-c78817155b72', '42773088-e38f-4578-bc2a-69d1797a90eb', 11, 'groupA'],
    ['962c397d-a8f8-4f1c-a589-ecf74a7da62d', 'b5baafb0-f6d4-4b4e-bc76-1287614b985d', 10, 'groupA'],
    ['a90fde40-9b9f-466e-bd5e-a40325b5fc9d', 'b3fba007-aef5-4a5f-a53b-94eb0705d953', 11, 'groupB'],
    ['22ebb056-603c-4f66-8240-8c54e8043509', 'b780fa66-addd-48c0-8db4-d755ebd351b8', 10, 'groupC'],
    ['52ffd64c-a5c1-4cd5-89c8-c1dcb8bd24b2', '37482cb7-c354-4b4b-92b6-2aaa62811e5b', 10, 'groupA'],
    ['55524169-f159-4c31-b939-bb00e1cba804', '34a9ff63-ea75-473d-ab89-9a92c3f4a8d9', 10, 'groupB'],
    ['2027d9d0-1e29-4d1f-969a-995a47f12052', '875488ea-85a2-47cb-b1ea-62003bbce80a', 10, 'groupA'],
    ['10d9c9fb-b5dd-4581-b148-a6198abecec1', '3f4b0604-513a-424b-98a3-e788ab3daa97', 11, 'groupD'],
    ['1c1e183b-6459-41bd-99aa-5f89b375006a', '53dd2ffd-c9b0-49c3-9275-190716c78799', 10, 'groupB'],
    ['31030ded-64a7-4854-8042-585605141e71', 'f0514527-2d7b-4cad-a36f-f21e3425093c', 10, 'groupD'],
    ['cdfd5a0c-dd8c-4546-ba31-c2f021fb4859', '1ed007fe-d4f7-41bc-8f3c-b163c57f8a1f', 11, 'groupE'],
    ['66bd16a5-b514-4d8a-ad7a-afb8921f7dd2', 'a2e9f137-bba5-46ec-8b13-7b17821de735', 10, 'groupB'],
    ['3cdb21d9-be3c-4723-bf28-0a7769d492b4', '9a6f1516-54a0-4dda-83d7-e05311e87ff5', 10, 'groupE'],
    ['d25f4cb2-3bf7-4898-a8a3-91d9e1b58576', '716a7732-6bcd-478d-87f9-c13cd83eaf66', 11, 'groupA'],
    ['e95134fd-7ce2-4e88-808c-e5abf13a4892', 'c021c21b-7bab-4e1f-9ff0-4dfc584263b8', 11, 'groupE'],
    ['e13da005-1033-466f-b984-48fdfa0988f2', '5bcc0651-0775-4fa5-b521-ac90e0a33b1c', 10, 'groupB'],
    ['b60ee53d-e4fc-4e37-aa1c-df67f66e304e', '592adca4-6fa6-48c3-be97-2357250d736d', 10, 'groupD'],
    ['c1d47246-838f-418a-a92d-7b5150122775', 'ff5d180c-cca9-474a-974e-e18c35cab912', 10, 'groupA'],
    ['fc129686-f7cd-407a-aca3-68f86c52af41', 'a18dfc3a-2ce6-43f7-a21f-4c7371cff2b6', 11, 'groupE'],
    ['191af645-cb9e-408a-af2e-b6826f7177b9', 'd430610b-b7da-42cb-aa93-c7f94774093c', 10, 'groupA']],
    columns=['clickId', 'sessionId', 'month', 'group'])

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(14, 6))

temp_df['group'] = pd.Categorical(temp_df['group'], ['groupA', 'groupB', 'groupC', 'groupD', 'groupE'])
temp_df.columns = ['clickId', 'sessionId', 'month', 'group']
temp_df.groupby(['group']).agg('sessionId': 'count').plot.pie(y='sessionId', ax=ax1)

sns.histplot(data=temp_df[['sessionId', 'month', 'group']].drop_duplicates(),
             x='month', hue='group', palette='tab10', alpha=1,
             stat='count', discrete=True, multiple="stack", shrink=0.8, ax=ax2)
ax2.xaxis.set_major_locator(MultipleLocator(1))
sns.despine(ax=ax2)
plt.tight_layout()
plt.show()

【讨论】:

我可以重现您在此处显示的结果,但是当我使用自己的非匿名数据时,两个图之间的颜色不匹配。知道为什么会发生这种情况吗?我会继续深入研究,但你的经验比我多。 您可以执行temp_df['group'] = pd.Categorical(temp_df['group']) 来修复组的排序。您看到的具体区别是什么?一个组比另一个组多吗?颜色是完全不同的,还是只是顺序不同?有超过10种颜色吗? (10种颜色后,饼图会开始重复颜色)。 两个图之间的颜色索引不同。我已经把代码的绘图部分变成了一个函数,只是改变了正在传递的数据——唯一的区别是行数……这对我来说毫无意义。但是分类分组使它起作用了!

以上是关于如何在不同的 seaborn 图中匹配调色板?的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?

10.14 plt,seaborn颜色设置

如何在 Seaborn 图中设置色调顺序

Seaborn:如何在条形图中用 X 轴中的文本替换索引?

如何在子图中绘制多个 Seaborn 联合图

如何在 seaborn 散点图中编辑多个图例框?