2017-01-23 4 views
1

В моей программе python у меня есть три семейства кривых для каждого, я хочу назначить палитру с морскими цветами и выстроить их в один сюжет.Семьи из кривых с разными палитрами на одном участке

Мое решение до сих пор является следующим кодом.

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

Я понимаю, что это прямо не отвечает на ваш вопрос (частично потому, что ваш код не является минимальным рабочим примером), но если вы собираетесь использовать seaborn, то, вероятно, в ваших интересах начать обработку ваши данные с pandas. Много seaborn написано с pandas в виду, и поэтому два джайва действительно хорошо. Заговор с несколькими цветовыми палитрами является одним из таких примеров,

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

+0

Спасибо вам кучу! Я нашел решение проблемы с помощью вашего метода. –

+0

@ThomasWening Отлично! Если он решит вашу проблему, вы можете подумать о том, чтобы мой ответ был правильно и/или повышал его. – lanery

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) 

То есть, извлечь палитру и передать его функции черчения. Надеюсь, это полезно.

Смежные вопросы