2016-11-02 12 views
0

Я пытаюсь создать барплот, где цвета баров будут выбраны в соответствии с заданными значениями из предопределенного набора цветов. Значение «pahse» определяет цвет. Он разделен на 3 диапазона и диапазоны ранжируются. Ранг используется для вызова палитры colorfrom. Эта часть работает нормально. Но я застрял в цветовой гамме. Цветная панель должна содержать цвета на основе клавиш словаря «rank_classes» и tiks/labels на основе значений, которые использовались для ранжирования. Я попробовал mpl.colorbar.plorbarBase(), но не похоже на seaborns sns.cubehelix_palette(). Интересно, как можно объединить эти две вещи или предложить более простые решения?Colorbar for barplot, когда цвета бара выбираются по рангу

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set_style("white") 
#%matplotlib inline 

index = ['25', '26', '27'] 
count = [10, 50, 22] 
phase = [0.9, 2.2, 1.2] 
ranks = [0, 2, 1] 

rank_classes = {0:"Ph<1", 1:"1<Ph<1.2", 2:"Ph>=1.2"} 

d = {'count' : pd.Series(count, index=index), 
    'phase' : pd.Series(phase, index=index), 
    'rank' : pd.Series(ranks, index=index) 
    } 

df = pd.DataFrame(d) 

# barplot 
fig, ax = plt.subplots() 
pal = sns.cubehelix_palette(3) 

x = df.index 
y = list(df['count']) 
z = list(df['rank']) 

sns.barplot(x=x, y=y, palette=np.array(pal)[z]) 
sns.despine() 
+0

ли вы имеете в виду, как это http://stackoverflow.com/questions/31313606/pyplot-matplotlib-bar-chart-with-fill-color-depending-on-value? – lanery

+0

@lanery Я вижу, трюк состоит в том, чтобы нарисовать две фигуры на вершине друг друга, а только от экрана разброса показать только цветную панель. В моем случае у меня есть две проблемы с адаптированием упомянутого кода для моих нужд. Во-первых, я хотел бы использовать морскую цветовую схему с предопределенным количеством цветов, например ** sns.cubehelix_palette (3) **. Но этот формат несовместим с cmap в plt.scatter(). Как сделать его совместимым? Во-вторых, как назначить предопределенные строковые метки («A», «B», «Z») для первого, второго и т. Д. Цветов в ** sns.cubehelix_palette (3) ** с использованием ** plt.colobar() **? – tonu

ответ

1

Почти там

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set_style("white") 
%matplotlib inline 

index = ['25', '26', '27'] 
count = [10, 50, 22] 
phase = [0.9, 2.2, 1.2] 
rank = [0, 2, 1] 
# 
rank_classes = {0:"Ph<1", 1:"1<Ph<1.2", 2:"Ph>=1.2"} 

pal = sns.cubehelix_palette(len(index)) 
cmp = mpl.colors.LinearSegmentedColormap.from_list('my_list', pal,\ 
                N=len(index)) 
plot = plt.scatter(index, count, c=range(len(index)), cmap=cmp) 
plt.clf() 
plt.colorbar(plot) 
sns.barplot(x=index, y=count, palette=np.array(pal)[rank]) 
sns.despine() 

Производит хороший участок с Colorbar. Единственное, что мне нужно выяснить, - это заменить метки ярлыков цветной панели (0, 0.3 ... 3.0) на строки, перечисленные в словаре rank_classes.

Bar plot with colobar

+0

Наконец-то мне удалось получить то, что мне было нужно: http://stackoverflow.com/questions/3831569/matplotlib-pyplot-colorbar-question и http://stackoverflow.com/questions/15908371/matplotlib-colorbars- и-его-текстовые метки – tonu