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

时间:2015-07-09 09:34:42

标签: python matplotlib

我想用matplotlib / pyplot生成 in 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()

这仍然缺少图例颜色栏


我在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")

并生成所需的输出:Example in R with ggplot

2 个答案:

答案 0 :(得分:14)

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

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

Bar chart with color bar

答案 1 :(得分:3)

您可以使用Normalize和ScalarMappable而无需绘制散点图。例如:

import matplotlib mpl
import matplotlib.pyplot as plt
from matplotlib import cm

f,(ax1,ax2) = plt.subplots(2)

#ax1 --> plot here your bar chart

norm = mpl.colors.Normalize(vmin=0, vmax=1)

mpl.colorbar.ColorbarBase(ax2, cmap=cm.RdBu,
                                norm=norm,
                                orientation='horizontal')

最后,将所需的格式添加到颜色栏。