如何在相同的情节中使用seaborn中的多个色彩映射

时间:2014-09-17 15:36:00

标签: python matplotlib seaborn

我有一些测试数据:

import numpy as np
x_data = np.arange(10)
y = np.random.rand(len(x_data))

具有不同的属性

ix1 = x_data < 5
ix2 = x_data >= 5

我想在视觉上调查这些差异,但我正在搞乱情节:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set_context('poster')

fig, ax = plt.subplots(figsize=(4, 4))
for i, x in enumerate(x_data):
    if ix1[i]:
        sns.set_palette('rainbow', sum(ix1))
    if ix2[i]:
        sns.set_palette('coolwarm', sum(ix2))
    plt.plot(x, y[i], 'o', label='{}'.format(x))
plt.legend(loc='best', prop={'size': 6})
plt.show()

结果应该是点0-4是彩虹(红紫),点5-9是冷静(蓝白红),而是:

seaborn output

所以,有两个问题:

  1. 拨打sns.set_palette()后可以致电plt.subplots吗?
  2. 有没有办法多次设置调色板?

1 个答案:

答案 0 :(得分:2)

不,由于matplotlib的工作方式,调色板是Axes对象的属性,因此无论当前设置的调色板是什么,创建Axes时它都是&#39 ; s将要使用。如果你想破解私有属性,可以解决这个问题(参见here),但我不建议这样做。

以下是我在您的案例中可以提出的方法,使用的方法可能不太广泛适用:

pal1 = sns.color_palette('rainbow', sum(ix1))
pal2 = sns.color_palette('coolwarm', sum(ix2))

fig, ax = plt.subplots(figsize=(4, 4))
ax.scatter(x_data[ix1], y[ix1], c=pal1, s=60, label="smaller")
ax.scatter(x_data[ix2], y[ix2], c=pal2, s=60, label="larger")
ax.legend(loc="lower right", scatterpoints=5)

enter image description here

FWIW,这种可视化感觉非常复杂且难以处理(并且您选择的两个调色板重叠相当多,并且不适合这些数据)因此可能值得从更简单的事情开始