python - Python:带颜色条的条形图
问题描述
我正在尝试用彩条制作条形图,每个条的高度是一个变量(y),每个条的颜色应取决于另一个变量(c)。
我要做的是这个(简单的例子):
data_x = [0,1,2,3]
data_hight = [60,60,80,100]
data_color = [1000,500,1000,900]
data_color = [x / max(data_color) for x in data_color]
fig, ax = plt.subplots(figsize=(15, 4))
my_cmap = plt.cm.get_cmap('GnBu')
colors = my_cmap(data_color)
rects = ax.bar(data_x, data_hight, color=colors)
CS = plt.contourf([data_x, data_color],cmap=my_cmap)
cbar = plt.colorbar(CS, cmap=my_cmap)
cbar.set_label('Color', rotation=270,labelpad=25)
plt.xticks(data_x)
plt.ylabel("Y")
plt.show()
主要问题是直方图颜色很好,但颜色条的比例不同。除此之外,我可以在 y=0 处看到一条蓝线,它不应该存在。
任何帮助将不胜感激。谢谢!
解决方案
您正在条形图中创建一个contourf
图。这是没有意义的。
相反,您需要创建一个没有任何视觉表示的可映射对象来提供给颜色条。这将是一个ScalarMappable
.
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
data_x = [0,1,2,3]
data_hight = [60,60,80,100]
data_color = [1000.,500.,1000.,900.]
data_color = [x / max(data_color) for x in data_color]
fig, ax = plt.subplots(figsize=(15, 4))
my_cmap = plt.cm.get_cmap('GnBu')
colors = my_cmap(data_color)
rects = ax.bar(data_x, data_hight, color=colors)
sm = ScalarMappable(cmap=my_cmap, norm=plt.Normalize(0,max(data_color)))
sm.set_array([])
cbar = plt.colorbar(sm)
cbar.set_label('Color', rotation=270,labelpad=25)
plt.xticks(data_x)
plt.ylabel("Y")
plt.show()
推荐阅读
- python - 循环以及如何检查输入是否为数字
- linux - 从已安装的 cd 光盘递归下载文件的问题
- regex - 正则表达式 PCRE 字段提取
- c++ - 如何将 C++ 连接到 Matlab
- c - 函数参数匿名结构
- postgresql - 在 Hibernate SQL 查询中去除列的名称
- c++ - 特别是,创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- java - 即使在使用 HttpStatus.BAD_REQUEST 返回 ResponseEntity 之后,在 API 响应中获取 HTTP 响应代码 200
- c - 如何使用 libgit2 创建一个空提交?
- android - 如何使用 SugarRecord 和 Kotlin 查询多个子句参数