Python 用户单击图形,图形将根据te事件的ydata进行更改

Python 用户单击图形,图形将根据te事件的ydata进行更改,python,pandas,matplotlib,onclick,event-handling,Python,Pandas,Matplotlib,Onclick,Event Handling,下面的代码应该根据单击事件时的数据更新图形(更改条形图的颜色)。有些情况下,颜色并不像想象的那样变化。此外,我还使用'ax.clear()'在每次单击图形时刷新重新绘制的条形图和线条。知道这个代码有什么问题吗 import numpy as np import matplotlib.pyplot as plt import matplotlib from matplotlib import cm import pandas as pd # Use the following data for

下面的代码应该根据单击事件时
的数据更新图形(更改条形图的颜色)。有些情况下,颜色并不像想象的那样变化。此外,我还使用
'ax.clear()'
在每次单击图形时刷新重新绘制的条形图和线条。知道这个代码有什么问题吗

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

# Use the following data for this assignment:
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])

fig, ax = plt.subplots()
#Plotting the Bar chart 
mean = df.mean(axis = 1)
std = df.std(axis = 1)
n= df.shape[1]
yerr = 1.96*std/np.sqrt(3650)
plt.bar(range(df.shape[0]), mean, yerr = yerr, color = 'grey',capsize=10, alpha = 0.5)
plt.xticks(range(len(df.index)), df.index)
plt.title('Proportion of confidence interval lying below the threshold value')
plt.ylabel('Number of votes')

#Click on the graph to choose a value, the color of the bar change based on the yvalue
colourofbars = [] 
norm = None
cmap = plt.cm.get_cmap('RdYlBu')
dict = {mean[x]: yerr[x] for x in list(df.index)}
def onclick(event):
    val = event.ydata
    global colourofbars
    global norm
    #Defining the condition based on the ydata
    for key,value in dict.items():
        if val > (key+(value)):
            colour = 0 
            colourofbars.append(colour)
        elif val < (key-(value)):
            colour = 1 
            colourofbars.append(colour)
        elif ((key+(value))> val > (key-(value))): 
            colour = ((key+(value))-val)/((key+value)-(key-value)) 
            colourofbars.append(colour)
    ax.clear()
    norm = matplotlib.colors.Normalize(vmin=min(colourofbars),vmax=max(colourofbars), clip=False)
    
    #Plotting the colored bar chart
    plt.bar(range(df.shape[0]), mean, yerr = yerr, capsize=10, alpha = 0.5, color=cmap(norm(colourofbars)))
    plt.axhline(y=val,linewidth=1, color='k')
    plt.gcf().canvas.draw_idle()

#Adding the colorbar legend
scalarmappaple = cm.ScalarMappable(norm=norm, cmap=cmap)
scalarmappaple.set_array(colourofbars)
plt.colorbar(scalarmappaple)
plt.gcf().canvas.mpl_connect('button_press_event', onclick)
fig.canvas.draw()
将numpy导入为np
将matplotlib.pyplot作为plt导入
导入matplotlib
从matplotlib导入cm
作为pd进口熊猫
#将以下数据用于此任务:
np.random.seed(12345)
df=pd.数据帧([np.随机.正常(3200020003650),
np.随机。正常(430001000003650),
np.随机。正常(4350014000003650),
np.随机.正常(4800070003650)],
索引=[1992199319941995])
图,ax=plt.子批次()
#绘制条形图
平均值=测向平均值(轴=1)
标准=测向标准(轴=1)
n=df.shape[1]
yerr=1.96*std/np.sqrt(3650)
plt.bar(范围(df.shape[0]),平均值,yerr=yerr,颜色=‘灰色’,倾覆=10,α=0.5)
plt.xticks(范围(长度(测向索引)),测向索引)
plt.title(‘低于阈值的置信区间比例’)
plt.ylabel(“票数”)
#单击图形选择一个值,条形图的颜色将根据Y值进行更改
棒的颜色=[]
正常=无
cmap=plt.cm.get_cmap('RdYlBu')
dict={mean[x]:列表(df.index)中x的yerr[x]
def onclick(事件):
val=event.ydata
棒的全局着色
全球规范
#基于ydata定义条件
对于键,dict.items()中的值:
如果val>(键+(值)):
颜色=0
棒的颜色。附加(颜色)
elif val<(键-(值)):
颜色=1
棒的颜色。附加(颜色)
elif((键+(值))>val>(键-(值)):
颜色=((键+值))-val/((键+值)-(键值))
棒的颜色。附加(颜色)
ax.clear()
norm=matplotlib.colors.Normalize(vmin=min(色条),vmax=max(色条),clip=False)
#绘制彩色条形图
plt.bar(范围(df.形状[0]),平均值,yerr=yerr,倾覆=10,alpha=0.5,颜色=cmap(标准(杆的颜色)))
plt.axhline(y=val,线宽=1,颜色=k')
plt.gcf().canvas.draw_idle()
#添加颜色栏图例
scalarMapple=cm.scalarMapable(norm=norm,cmap=cmap)
ScalarMapple.set_数组(色条)
打印颜色条(ScalarMapple)
plt.gcf().canvas.mpl\u connect('button\u press\u event',onclick)
图canvas.draw()

在Jupyter笔记本中,您必须添加

%matplotlib notebook
为了使绘图具有交互性(可以在导入语句后添加该行)

通过上述陈述,我得到了这个图:

如果单击绘图中的某个位置,我会得到:


在Jupyter笔记本中,您必须添加

%matplotlib notebook
为了使绘图具有交互性(可以在导入语句后添加该行)

通过上述陈述,我得到了这个图:

如果单击绘图中的某个位置,我会得到:


您是在使用IDE(如PyCharm)还是在Jupyter笔记本中运行代码?@Andrea Blengino我在使用Jupyter笔记本进行编码您是在使用IDE(如PyCharm)还是在Jupyter笔记本中运行代码?@Andrea Blengino我在使用Jupyter笔记本进行编码