在一个图中具有不同的seaborn调色板的曲线族

时间:2017-01-23 12:10:36

标签: python matplotlib seaborn

在我的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'但在同一图中?

2 个答案:

答案 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')

enter image description here

答案 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)

即 提取调色板并将其传递给绘图功能。 希望这很有用。