按栏位选择条形颜色时条形图的颜色栏

时间:2016-11-02 16:24:48

标签: python matplotlib seaborn colorbar

我正在尝试制作条形图,其中将根据预定义颜色组中的给定值选择条形颜色。 " pahse"值决定了颜色。它分为3个范围​​,范围排名。 Rank用于调用调色板中的颜色。这部分工作正常。但我坚持使用colorbar。 Colorbar应该包含基于字典键的颜色" rank_classes"和tiks / labels基于用于排名的值。我尝试了matplotlib' smpl.colorbar.ColorbarBase(),但它似乎不喜欢seaborns sns.cubehelix_palette()。我想知道如何将这两件事放在一起工作还是有更直接的解决方案?

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()

1 个答案:

答案 0 :(得分: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制作精美的情节。我唯一需要弄清楚的是如何用字典 rank_classes 中列出的字符串替换colorbar的数字标签(0,0.3 ... 3.0)。

Bar plot with colobar