首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交互式滑块条形图颜色控制

交互式滑块条形图颜色控制
EN

Stack Overflow用户
提问于 2017-03-26 22:30:21
回答 1查看 1.5K关注 0票数 0

我有四组随机正态分布的数字。该方法用于绘制条形图,每组95%的置信区间用错误条绘制。

给定一个值y,四种不同的颜色将被设置到对应于四个范围y的条形上: 1.下限到avg;2. avg到上界;3.下界;4.上界。

我想要使用滑块来控制y值,每次滑动时更新条形图,我尝试使用以下代码,但是条形图不能每次更新。

谁能给我点主意吗?

代码语言:javascript
复制
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import scipy.stats as st
from matplotlib.widgets import Slider

np.random.seed(12345)

df = pd.DataFrame([np.random.normal(33500,150000,3650), 
                   np.random.normal(41000,90000,3650), 
                   np.random.normal(41000,120000,3650), 
                   np.random.normal(48000,55000,3650)], 
                  index=[1992,1993,1994,1995])

N = len(df.columns)-1  # Degree of Freedom
avg = df.mean(axis=1)  # Mean for each row
std = df.sem(axis=1)  # Unbiased Standard Deviation

year = df.index.map(str)  # Convert to String
conf95 = st.t.ppf(0.95, N)*std  # 95% Confidence Interval

upper = avg + conf95
lower = avg - conf95
colormap = ['blue', 'aqua', 'orange', 'brown']

ini = 39900
chk1 = ini>upper  # Check if y is greater than upper bound: blue
chk2 = ini<lower  # CHeck if y is smaller than lower bound: brown
chk3 = (ini>=lower) & (ini<=avg) # Check if y is in between avg and lower: orange
chk4 = (ini>avg) & (ini<=upper) # Check if y is in between avg and upper: aqua


fig, ax =plt.subplots()   
ax.bar(df.index[chk1.values], avg.iloc[chk1.values], width=1, edgecolor='k', color='blue')
ax.bar(df.index[chk2.values], avg.iloc[chk2.values], width=1, edgecolor='k', color='brown')
ax.bar(df.index[chk3.values], avg.iloc[chk3.values], width=1, edgecolor='k', color='orange')
ax.bar(df.index[chk4.values], avg.iloc[chk4.values], width=1, edgecolor='k', color='aqua')
ax.axhline(y=ini,xmin=0,xmax=10,linewidth=1,color='k')

ax.errorbar(df.index, avg, yerr=conf95, fmt='.',capsize=15, color='k')
plt.subplots_adjust(left=0.1, bottom=0.2)
plt.xticks(df.index, year)  # Map xlabel with String
plt.yticks(np.arange(0,max(avg)+1,max(avg)/5))

axcolor = 'lightgoldenrodyellow'
axy = plt.axes([0.1, 0.1, 0.7, 0.03], axisbg=axcolor)

sy = Slider(axy, 'y', 0.1, int(max(upper)+1), valinit=ini)

在这一步之前,颜色很好。那么更新功能就不能工作了。

代码语言:javascript
复制
def update(val):
    ax.cla()
    yy = sy.val    
    chk1 = yy>upper
    chk2 = yy<lower
    chk3 = (yy>=lower) & (yy<=avg)
    chk4 = (yy>avg) & (yy<=upper)
    ax.bar(df.index[chk1.values], avg.iloc[chk1.values], width=1, edgecolor='k', color='blue')
    ax.bar(df.index[chk2.values], avg.iloc[chk2.values], width=1, edgecolor='k', color='brown')
    ax.bar(df.index[chk3.values], avg.iloc[chk3.values], width=1, edgecolor='k', color='orange')
    ax.bar(df.index[chk4.values], avg.iloc[chk4.values], width=1, edgecolor='k', color='aqua')
    ax.bar(df.index, avg, width=1, edgecolor='k', color='silver')
    ax.errorbar(df.index, avg, yerr=conf95, fmt='.',capsize=15, color='k')
    ax.axhline(y=yy,xmin=0,xmax=10,linewidth=1,color='k')
    fig.canvas.draw_idle()

sy.on_changed(update)  

非常感谢你们的洞察力,非常感谢!

最佳肖恩

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-26 23:11:35

只需删除行

代码语言:javascript
复制
ax.bar(df.index, avg, width=1, edgecolor='k', color='silver')

我不知道你为什么把它放在那里,但它会在彩色条形图上绘出完整的单色条形图,然后把它们隐藏起来。

为了使某些交互成为可能,需要使用交互式后端。因此,当设置IPython模式时,%matplotlib inline模式将无法在%matplotlib inline中显示出来。你有以下选择:

  • 使用%matplotlib notebook在IPython Qt控制台或jupyter笔记本。
  • 在将代码作为脚本运行时,通过添加plt.show()来使用GUI后端。在Spyder中,可以通过在新的专用窗口(如sketched here )中运行脚本来确保这一点。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43035368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档