在我的python程序中,我有三个曲线族,我想分配一个seaborn调色板并将它们全部绘制成一个单独的图。
到目前为止,我的解决方案是以下代码。
sns.set_style('whitegrid')
volt = np.zeros(N)
states = np.zeros([6,N])
for k in range(1,4):
if k == 1:
sns.set_palette('Blues_d',6)
if k == 2:
sns.set_palette('BuGn_d',6)
if k == 3:
sns.set_palette('Oranges_d',6)
for i in range(N):
j = -1 + 2*float(i)/N
volt[i] = j*(mu[1]-mu[0])
state = evolve(s, ss, PP, beta, float(k) * D / 3, B, j * mu, tmax)
for j in range(6):
states[j,i] = state[j]
for i in range(6):
y = np.zeros(N)
for j in range(N):
y[j] = states[i,j]
plt.plot(volt,y)
plt.show()
然而,情节总是最终在第一个调色板中呈现出来< Blues_d'。如何更改代码,以便第一个曲线族用' Blues_d'绘制,第二个曲线用' BuGn_d'还有第三个与Oranges_d'但在同一图中?
答案 0 :(得分:2)
我意识到这并没有直接回答你的问题(部分是因为你的代码不是最小的工作示例),但是如果你将要使用seaborn
那么它很可能为了您的最佳利益,开始使用pandas
处理您的数据。很多seaborn
都是用pandas
写的,因此两个jive非常好。使用多个调色板绘图就是一个这样的例子,
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns; sns.set_style('whitegrid')
x = np.linspace(0, 3, 31)
U_df = pd.DataFrame({
'u1': 2.6*x**2 - 4.5,
'u2': 2.5*x**2 - 4.9,
'u3': 2.3*x**2 - 4.7}, index=x)
V_df = pd.DataFrame({
'v1': -5.1*x + 11,
'v2': -4.9*x + 10,
'v3': -5.5*x + 12}, index=x)
W_df = pd.DataFrame({
'w1': -6.5*(x-1.6)**2 + 9.1,
'w2': -6.2*(x-1.8)**2 + 9.5,
'w3': -6.1*(x-1.5)**2 + 9.7}, index=x)
fig, ax = plt.subplots()
U_df.plot(ax=ax, color=sns.color_palette('Blues_d', 3))
V_df.plot(ax=ax, color=sns.color_palette('BuGn_d', 3))
W_df.plot(ax=ax, color=sns.color_palette('Oranges_d', 3))
ax.legend(ncol=3, loc='best')
答案 1 :(得分:0)
也许How to use multiple colormaps in seaborn on same plot会很有用。尝试从mwaskom回答:
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)
即 提取调色板并将其传递给绘图功能。 希望这很有用。