pyplot/matplotlib带有填充颜色的条形图,具体取决于值

har*_*oth 10 python matplotlib

我想用matplotlib/pyplot 在python中生成

  • 带有填充的条形图,具体取决于值.
  • 传奇色条

同时将模块依赖性保持在最低限度.


有什么比这简单:

import matplotlib.pyplot as plt

def color_gradient ( val, beg_rgb, end_rgb, val_min = 0, val_max = 1):
    val_scale = (1.0 * val - val_min) / (val_max - val_min)
    return ( beg_rgb[0] + val_scale * (end_rgb[0] - beg_rgb[0]),
             beg_rgb[1] + val_scale * (end_rgb[1] - beg_rgb[1]),
             beg_rgb[2] + val_scale * (end_rgb[2] - beg_rgb[2]))

# -----------------------------------------------
x_lbls = [ "09:00", "09:15", "10:10"]
y_vals = [       7,       9,       5]

plt_idx = np.arange( len( x_lbls))
bar_wd  = 0.35

grad_beg, grad_end = ( 0.5, 0.5, 0.5), (1, 1, 0)
col_list = [ color_gradient( val,
                             grad_beg,
                             grad_end,
                             min( y_vals),
                             max( y_vals)) for val in y_vals]

plt.bar( plt_idx, y_vals, color = col_list)
plt.xticks( plt_idx + bar_wd, x_lbls)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这仍然缺少传奇颜色条


我在R中与ggplot的解决方案是:

library(ggplot2)
df = data.frame( time = 1:10, vals = abs(rnorm( n = 10)))
ggplot( df, aes( x = time, y = vals, fill = vals)) + 
  geom_bar(stat = "identity") + 
  scale_fill_gradient(low="#888888",high="#FFFF00")
Run Code Online (Sandbox Code Playgroud)

并产生所需的输出: 带有ggplot的R中的示例

Amy*_*den 15

我无法弄清楚如何在不绘制其他东西然后清除它的情况下让colorbar工作,所以这不是最优雅的解决方案.

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

y = np.array([1, 4, 3, 2, 7, 11])
colors = cm.hsv(y / float(max(y)))
plot = plt.scatter(y, y, c = y, cmap = 'hsv')
plt.clf()
plt.colorbar(plot)
plt.bar(range(len(y)), y, color = colors)
plt.show()
Run Code Online (Sandbox Code Playgroud)

条形图与颜色条