使用特定值改变条形图中每个条形的颜色

时间:2013-09-19 19:53:35

标签: python matplotlib

我有一个如下所示的条形图:http://matplotlib.org/examples/api/barchart_demo.html

在这种情况下,我们假设每组G1-G5代表每组中男性参加某些考试的平均分数,每组中的女性参加相同的考试。

现在假设我有一些与每个组相关的其他功能(平均可爱性(在1-5之间浮动))。

Ex: Avg Likability of men in G1 - 1.33
                   Avg Likability of women in G1 - 4.6
                   Avg Likability of men in G2- 5.0
                   .... etc...

让我们假设1 - 不讨人喜欢,5 - 非常讨人喜欢

我想知道如何通过更改颜色示例的阴影将这个可爱性功能合并到每个栏中:           因为上面例子中第1组的男人有1.33,所以他们的图形会比G2男人的阴影颜色浅,因为G2的男人有5.0可爱,他们的条形图将是图中最暗的红色阴影,并且女人也一样。

我希望我已经说清楚了。如果有人能指出matplotlib中可以实现这一目标的资源,我真的很感激,因为我对这个软件包很陌生。

提前致谢。

3 个答案:

答案 0 :(得分:5)

bar将颜色列表作为参数(docs)。只需传递你想要的颜色。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import Normalize
from numpy.random import rand

fig, ax = plt.subplots(1, 1)
# get a color map
my_cmap = cm.get_cmap('jet')
# get normalize function (takes data in range [vmin, vmax] -> [0, 1])
my_norm = Normalize(vmin=0, vmax=5)
# some boring fake data
my_data = 5*rand(5)
ax.bar(range(5), rand(5), color=my_cmap(my_norm(my_data)))

plt.show()

enter image description here

答案 1 :(得分:3)

import matplotlib.pyplot as plt
import matplotlib as mp
import numpy as np


xs = "ABCDEFGHI"
ys = [5, 6, 7, 8, 9, 10, 11, 12, 13]


#Colorize the graph based on likeability:

likeability_scores = np.array([
    5, 4.5, 3.5,
    2.5, 1.5, .5,
    2, 3, 4,
])

data_normalizer = mp.colors.Normalize()
color_map = mp.colors.LinearSegmentedColormap(
    "my_map",
    { 
        "red": [(0, 1.0, 1.0),
                (1.0, .5, .5)],

        "green": [(0, 0, 0),
                  (1.0, 0, 0)],

        "blue": [(0, 0, 0),
                 (1.0, 0, 0)]
    }

)

#Map xs to numbers:
N = len(xs)
x_nums = np.arange(1, N+1)

#Plot a bar graph:
plt.bar(
    x_nums,
    ys,
    align="center",
    color=color_map(data_normalizer(likeability_scores))
)

#Change x numbers back to strings:
plt.xticks(x_nums, xs)

plt.show()

--output:--

enter image description here

r,g,b值从0-1开始。这是红色映射:

       "red": [(0, 1.0, 1.0),
               (1.0, .5, .5)],

每个元组中的第一个元素指定了规范化的可喜性分数。每个元组中的第二个元素指定红色(0-1)的阴影。每个元组中的第三个元素用于更复杂的东西,所以这里它总是与第二个元素相同。

红色映射指定0-1.0(每个元组的第一个元素)之间的归一化可喜性得分将被映射到100%红色到50%红色(每个元组中的第二个元素)的范围。归一化的可喜性得分为0将被映射到100%的红色,而归一化的可喜性得分为1.0将被映射到50%的红色。将最暗的红色设置为50%可使红色变暗,看起来是棕色或黑色。

您可以根据需要指定任意数量的元组 - 您只需确保为标准化喜欢分数的整个范围(0-1)指定红色值,例如:

       "red": [(0, .5, .5),
               (.8, .6, .6),
               (1.0, .9, .9)],

你不能这样做:

       "red": [(0, .5, .5),
               (.8, 1.0, 1.0)],

答案 2 :(得分:2)

import pandas as pd
import matplotlib.pyplot as plt  

df = pd.DataFrame([1,2,3,4], [1,2,3,4])   
color = ['red','blue','green','orange']
df.plot(kind='bar', y=0, color=color, legend=False, rot=0)

enter image description here