简体   繁体   English

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

[英]pyplot/matplotlib Bar chart with fill color depending on value

I want to produce in python with matplotlib/pyplot 我想用matplotlib / pyplot 在python中生成

  • a bar chart with a fill depending on the value. 带有填充的条形图,具体取决于值。
  • legend color bar 传奇色条

while keeping module dependencies at a minimum. 同时将模块依赖性保持在最低限度。


Is there something simpler than: 有什么比这简单:

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

this is still missing the legend color bar 这仍然缺少传奇颜色条


my solution in R with ggplot would be: 我在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")

and produces the desired output: 并产生所需的输出: 带有ggplot的R中的示例

I couldn't figure out how to get the colorbar to work without plotting something else and then clearing it, so it's not the most elegant solution. 我无法弄清楚如何在不绘制其他东西然后清除它的情况下让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()

条形图与颜色条

You can use Normalize and ScalarMappable without plotting a scatter. 您可以使用Normalize和ScalarMappable而不绘制散点图。 For example: 例如:

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

Finally, add the desired format to the colorbar. 最后,将所需的格式添加到颜色栏。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM