【问题标题】:How to control axis and bar labels in a bar plot containing slider widget?如何在包含滑块小部件的条形图中控制轴和条形标签?
【发布时间】:2021-10-19 13:31:29
【问题描述】:

我的条形图中的 20 个条有标签存储在

channels=['a','b','c','d','e','f','g','h','i','j','k','m','n','o','p','q','r','s','t','u']

每个标签都有一个 0 到 100 之间的非负整数,我想一次绘制 5 个条形图,使用滑块在通道中前进。我正在尝试修改Scrollable Bar graph matplotlib 的方法来这样做。到目前为止,这是我所拥有的:

fig,ax=plt.subplots(figsize=(10,6))

x=np.arange(1,20)
y=np.random.randint(0,100, len(x))
channels=
['a','b','c','d','e','f','g','h','i','j','k','m','n','o','p','q','r','s','t','u']

N=5

def bar(pos):
    pos = int(pos)
    ax.clear()
    if pos+N > len(x): 
        n=len(x)-pos
    else:
        n=N
    X=x[pos:pos+n]
    Y=y[pos:pos+n]
    ax.bar(X,Y,width=0.7,align='edge',color='green',ecolor='black')

    for i,txt in enumerate(X):
        ax.annotate(channels[i], (X[i],Y[i]))

barpos = plt.axes([0.18, 0.05, 0.55, 0.03], facecolor="skyblue")
slider = Slider(barpos, 'Channel', 0, len(x)-N, valinit=0,valstep=1)
slider.on_changed(bar)

bar(0)
plt.show()

这是半功能性的,但有一个错误和三个小修改我似乎无法弄清楚。

  1. 目前,当我在滑块上前进每一帧时,N=5 个标签始终是“a”、“b”、“c”、“d”、“e”。当然,我希望改变标签,以便第二帧的标签是'b','c','d','e','f'。
  2. 我想让我的 y 轴标签在滑块移动时固定,从 0 到 100 以 20 为增量运行。在目前的表格中,y 轴标签随着我移动滑块而变化。 y轴的增量有时是10,有时是20等。最大y轴标签一般是y中所有值的最大值。
  3. 如何控制每个标签的字体大小?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    这似乎可行,尽管非常欢迎提出提高效率的建议。解决上面 #1 和 #3 的关键是将注释更改为 read

    ax.annotate(channels[txt-1], (X[i],Y[i]),fontsize=16)
    

    坐标轴问题由ax.set_yticksax.set_ylim处理

    那么我们有以下内容:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.widgets import Slider
    
    fig,ax=plt.subplots(figsize=(10,6))
    
    fig.suptitle('My Title', fontsize=20)
    
    x=np.arange(1,21)
    y=np.random.randint(0,100, len(x))
    
    channels= ['a','b','c','d','e','f','g','h','i','k','l',
    'i','j','k','m','n','o','p','q','r','s','t','u']
    
    N=5
    
    def bar(pos):
        pos = int(pos)
        ax.clear()
        if pos+N > len(x): 
            n=len(x)-pos
        else:
            n=N
        X=x[pos:pos+n]
        Y=y[pos:pos+n]
        ax.bar(X,Y,width=0.7,align='center',color='green',ecolor='black')
    
    
        ax.yaxis.set_visible(True)
        y_incr = np.arange(0,100,25)
        ax.set_yticks(y_incr)
        ax.set_ylim(top=100)
    
        for i,txt in enumerate(X):
            ax.annotate(channels[txt-1], (X[i],Y[i]),fontsize=16)
    
        ax.xaxis.set_ticks([])
    
    barpos = plt.axes([0.18, 0.05, 0.55, 0.03], facecolor="skyblue")
    slider = Slider(barpos, 'Channel', 0, len(x)-N, valinit=0,valstep=1)
    
    
    slider.on_changed(bar)
    bar(0)
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2017-10-30
      • 2020-09-27
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多