如何在同一图中使用多个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显示成冷暖色(蓝色到白色再到红色),但实际上却是这样:
所以,我有两个问题:
- 在调用
plt.subplots
之后调用sns.set_palette()
是可以的吗? - 有没有办法多次设置调色板?
1 个回答
2
不可以,因为matplotlib的工作方式决定了颜色调色板是Axes
对象的一个属性。所以,当一个Axes
对象被创建时,它会使用当时设置的调色板。虽然有办法绕过这个限制,去修改一些私有属性(可以参考这里),但我并不推荐这样做。
在你的情况下,我想出了一个稍微不同的方法,虽然这个方法可能不适用于所有情况:
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)
顺便说一下,这个可视化看起来比较复杂,理解起来有点困难(而且你选择的两个调色板重叠得比较多,并不太适合这些数据),所以可能从简单的开始会更好。