使用特定值改变条形图中每个条的颜色
- 2025-03-11 08:50:00
- admin 原创
- 64
问题描述:
我有一个如下的条形图: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 中可以实现这一点的资源,我将不胜感激,因为我对这个包很陌生。
解决方案 1:
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()
解决方案 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)
解决方案 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:--
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)],
解决方案 4:
创建按乘客人数计算的平均小费条形图
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
df=pd.read_csv('data/2017_Yellow_Taxi_Trip_Data.csv')
根据乘客人数计算平均小费
mean_tips_by_passenger_count = df.groupby(['passenger_count']).mean()[['tip_amount']]
data = mean_tips_by_passenger_count.tail(-1) # removing data with zero passenger [consider as a outlier]
pal = sns.color_palette("Greens_d", len(data)) # Choosing a number of diffrent green shade, here total 6 shades.
rank = data['tip_amount'].argsort().argsort()
plt.figure(figsize=(12,7))
ax = sns.barplot(x=data.index,
y=data['tip_amount'],
palette=np.array(pal[::-1])[rank])
ax.axhline(df['tip_amount'].mean(), ls='--', color='red', label='global mean') # Creating mean line into BarPlot
ax.legend()
plt.title('Mean tip amount by passenger count', fontsize=16);
扫码咨询,免费领取项目管理大礼包!