首页 > 解决方案 > 如何为直方图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()

产生一个输出:

在此处输入图像描述

我如何才能对位于绿色边界之间的直方图的一部分与绿色边界之外的部分进行渐变着色?还要挑选几乎是绿色边框的垃圾箱并将它们变成另一种颜色?

谢谢。

标签: pythonmatplotlibhistogram

解决方案


我不确定这里“渐变”的确切含义。这里有一些想法可以作为创建所需解决方案的基础。

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

使用高斯 kde 作为颜色


推荐阅读