python - 如何为直方图matplotlib的选定范围着色?
问题描述
我有一个名为 的数据prices
,我使用 aprices.tail(1)
来构建直方图。
我也有一些变量:left_border = 341.086
, right_border = 437.177
, line_length = 1099
.
接下来的代码:
plt.figure(figsize=(9,6))
plt.hist(prices.tail(1), bins = 400)
x2 = [left_border,left_border]
y2 = [0, line_length]
plt.plot(x2, y2, color = 'green')
x3 = [right_border, right_border]
y3 = [0, line_length]
plt.plot(x3, y3, color = 'green')
plt.show()
产生一个输出:
我如何才能对位于绿色边界之间的直方图的一部分与绿色边界之外的部分进行渐变着色?还要挑选几乎是绿色边框的垃圾箱并将它们变成另一种颜色?
谢谢。
解决方案
我不确定这里“渐变”的确切含义。这里有一些想法可以作为创建所需解决方案的基础。
hist
返回每个 bin 的值、bin 的限制和绘制的补丁;您可以根据它们的平均 x 位置为补丁着色- 要创建类似渐变的效果,最简单的方法是在两种颜色之间进行线性插值;一个函数比如
sqrt
可以用来使效果开始更快 axvspan
可以在两个给定的 x 坐标之间绘制垂直跨度;设置zorder=0
以确保跨度保持在直方图条的后面;或设置一个alpha=0.3
以将其绘制为条形上方的透明层
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
prices_np = 14*np.random.normal(5, 1, 10000)**2
left_border = 341.086
right_border = 437.177
# line_length = 1099
divisor_tickness = 10
main_color = mcolors.to_rgb('dodgerblue')
highlight_color = mcolors.to_rgb('limegreen')
divisor_color = mcolors.to_rgb('crimson')
binvals, bins, patches = plt.hist(prices_np, bins = 400, color=main_color)
bin_centers = 0.5 * (bins[:-1] + bins[1:])
for p, x in zip(patches, bin_centers):
#x, _ = p.get_xy()
#w = p.get_width()
if left_border < x < right_border:
f = 2*min(x-left_border, right_border-x) / (right_border - left_border)
f = f ** 0.5
p.set_facecolor([ (h_rgb*f + m_rgb * (1-f)) for m_rgb, h_rgb in zip(main_color, highlight_color)] )
elif left_border-divisor_tickness < x <= left_border or right_border <= x < right_border + divisor_tickness:
p.set_facecolor(divisor_color)
plt.axvspan(left_border, right_border, color='lightgoldenrodyellow', zorder=0)
plt.show()
要根据条形高度获得平滑渐变,高斯 kde可能很有用:
kde = gaussian_kde(prices_np)
max_kde = max([kde(x)[0] for x in bin_centers])
for x, p in zip(bin_centers, patches):
p.set_facecolor(plt.cm.viridis((kde(x)[0] / max_kde) ))
推荐阅读
- android - Jetpack Compose 项目在我向其添加匿名类后未构建
- php - 仅当当前登录作者 Wordpress 撰写时才显示单个帖子
- javascript - Puppeteer - 如何等待 xhr 完成并检查它是否失败
- twilio - Twilio 不会在来电时发布到我的 webhook
- javascript - 自动完成选择项中未捕获的错误
- java - 某些设备上的 Resources$NotFoundException (setIcon)
- python - 如何计算训练相似度矩阵的加权平均值
- c# - 构建器设计模式和使用从其他类继承的类有什么区别?
- r - 如何使用 R 在 Firefox 中伪造我的位置?
- python - 如何选择性地将参数传递给子进程?