在相同的绘图空间上绘制两个 Seaborn sns.kdeplot 图形,但每个图形都有一个具有相同范围的不同颜色条

Posted

技术标签:

【中文标题】在相同的绘图空间上绘制两个 Seaborn sns.kdeplot 图形,但每个图形都有一个具有相同范围的不同颜色条【英文标题】:Plot two Seaborn sns.kdeplot figures on same plot space but each with a different colorbar with same range 【发布时间】:2022-01-18 01:17:25 【问题描述】:

我已经尝试了几个小时了。

我本质上是想让颜色条的比例相同。

我从上一篇文章中选择了这个例子,其中一个建议是使用kwargs = 'levels': np.arange(0, 0.15, 0.01) 行。我已经包含了它,但我没有看到任何变化,比例保持不变。

这是我正在使用的代码:

import numpy as np
import seaborn as sns
import pandas
import matplotlib.pyplot as plt
from matplotlib import rcParams


np.random.seed(10)
sns.set(color_codes=True)

rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Arial']

plt.ioff()
kwargs = 'levels': np.arange(0, 0.15, 0.01) #trying to get the colorbar scales to be the same
f, ax = plt.subplots(figsize=(7, 5))
ax.tick_params(axis='both', which='major', labelsize=22)

mean, cov = [0, 2], [(2, 1), (.5, 1)]
x1, y1 = np.random.multivariate_normal(mean, cov, size=50).T

mean, cov = [5, 7], [(3, 2), (7, 1)]
x2, y2 = np.random.multivariate_normal(mean, cov, size=50).T

sns.kdeplot(x1, y1, cmap="Reds",   shade=True, shade_lowest=False,
             alpha=0.66, legend=False, cbar=True, **kwargs, ax= ax )
sns.kdeplot(x2, y2, cmap="Greens", shade=True, shade_lowest=False, alpha=0.66,\
                 legend=False, cbar=True,**kwargs, ax = ax)

plt.xlabel("foo", fontsize=22)
plt.ylabel("bar", fontsize=22)

非常感谢您的帮助

【问题讨论】:

我觉得魔法发生在这部分代码中:github.com/mwaskom/seaborn/blob/… 据我了解,0 到 1 之间的级别被视为分位数并映射回来,这会导致颜色条不一致。我不确定是否以及如何规避这种情况。 将它们放入长格式数据框中并使用hue 【参考方案1】:

根据@mwaskom 的线索,这是我设法达到您预期结果的最接近的结果:

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


np.random.seed(10)
sns.set(color_codes=True)

rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Arial']

kwargs = 
f, ax = plt.subplots(figsize=(7, 5))
ax.tick_params(axis='both', which='major', labelsize=22)

mean, cov = [0, 2], np.array([(2, 1), (.5, 1)])
x1, y1 = np.random.multivariate_normal(mean, cov, size=50).T

mean, cov = [5, 7],  np.array([(3, 2), (7., 1)])
x2, y2 = np.random.multivariate_normal(mean, cov, size=50).T


x = np.concatenate((x1, x2))
y = np.concatenate((y1, y2))
class_labels = ['class 1']*len(x1) + ['class 2']*len(x2)
df = pd.DataFrame(
    'x': x,
    'y': y,
    'class': class_labels,
)

palette = 
    'class 1' : 'Red',
    'class 2': 'Green',


sns.kdeplot(x='x', y='y', data=df, hue='class', palette=palette, shade=True, thresh=0.05,
             alpha=0.66, legend=False, cbar=True, **kwargs, ax= ax)

plt.xlabel("foo", fontsize=22)
plt.ylabel("bar", fontsize=22)

【讨论】:

以上是关于在相同的绘图空间上绘制两个 Seaborn sns.kdeplot 图形,但每个图形都有一个具有相同范围的不同颜色条的主要内容,如果未能解决你的问题,请参考以下文章

Python。在 Seaborn Facetgrid 上使用两个 y 轴绘制线图和条形图

在 Seaborn 中绘图时 Python 代码出错

可视化库-seaborn-回归分析绘图(第五天)

在 pandas 中使用 groupby 命令后使用 seaborn 进行绘图

seaborn#3 单变量分析绘图

seaborn 没有在定义的子图中绘制