首页 > 解决方案 > 参考 MatPlotLib 中的绘图条

问题描述

我有下面的代码,我试图弄清楚如何根据选择事件更改条的颜色。当我单击一个条时,它会运行 onpick(),将高度与平均值进行比较并制作一个颜色列表,然后将其传递给 ax.bars 行中的条

我可以用变量 y 拉出点击的艺术家(一个 patch.rectangle),然后我可以用 plt.getp(y) 找到它的属性,它告诉我面色是什么。如果我尝试 plt.setp(y, fc='k') 我可以看到 y 的 facecolour 属性已经改变,但情节没有改变。关于如何引用绘制的矩形并更新其属性的任何帮助?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy.stats as st
import statsmodels.stats.api as sms

%matplotlib notebook

np.random.seed(12345)

df = pd.DataFrame([np.random.normal(32000,200000,3650), 
                   np.random.normal(43000,100000,3650), 
                   np.random.normal(43500,140000,3650), 
                   np.random.normal(48000,70000,3650)], 
                  index=[1992,1993,1994,1995])
df = df.T
fig = plt.figure()
ax = fig.add_subplot(111)
text=ax.text(0,45000, 'asdf',va='baseline', ha='left')
means = []
yerrs = []
for x in df.columns:
    means.append(df[x].mean())
    yerrs.append((df[x].mean()-sms.DescrStatsW(df[x]).tconfint_mean()[0]))
colours=['r','b','k','m']
ax.bar(range(len(means)),means,yerr=yerrs, capsize=3, picker=True, label=df.index)
ax.set_xticklabels([None,'1992','1993','1994','1995'])
ax.locator_params('x',nbins=8)
def onpick(event):
    global x
    x = float(event.artist.get_height())
    global y
    y = event.artist
    global colours
    colours=[]
    global heights
    heights=[]
    for value in means:
        heights.append(value)
        if x == value:
            colours.append('k')
        if x > value:
            colours.append('r')
        if x < value:
            colours.append('b')
    ax.cla()
    global bars
    ax.bar(range(len(means)),means,yerr=yerrs, capsize=3, picker=True)
    ax.set_xticklabels([None,'1992','1993','1994','1995'])
    ax.locator_params('x',nbins=8)
    #plt.setp(y, fc='k', fill=False)
    
    plt.draw()
    #plt.setp(y, height=20000)
    #fig.canvas.draw()
    
fig.canvas.mpl_connect('pick_event', onpick)

标签: pythonmatplotlib

解决方案


推荐阅读