您现在的位置是:首页 > 正文

Python 绘图与可视化 matplotlib 动态条形图 bar

2024-04-01 00:32:15阅读 1

bar的参考链接:https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.bar.html

第一种办法

一种方法是每次都重新画,包括清除figure

def animate(fi):
        bars=[]
        if len(frames)>fi:
            # axs.text(0.1,0.90,time_template%(time.time()-start_time),transform=axs.transAxes)#所以这样
            time_text.set_text(time_template%(0.1*fi))#这个必须没有axs.cla()才行
            # axs.cla()
            axs.set_title('bubble_sort_visualization')
            axs.set_xticks([])
            axs.set_yticks([])
            bars=axs.bar(list(range(Data.data_count)),#个数
                         [d.value for d in frames[fi]],#数据
                         1,                             #宽度
                         color=[d.color for d in frames[fi]]#颜色
                         ).get_children()
        return bars
    anim=animation.FuncAnimation(fig,animate,frames=len(frames), interval=frame_interval,repeat=False)

 

这样效率很低,而且也有一些不可取的弊端,比如每次都需要重新设置xticks、假如figure上添加的有其他东西,这些东西也一并被clear了,还需要重新添加,比如text,或者labale。

 

第二种办法

参考链接:https://stackoverflow.com/questions/16249466/dynamically-updating-a-bar-plot-in-matplotlib

这个链接里的内容和上面的差不多:https://stackoverflow.com/questions/34372021/python-matplotlib-animate-bar-and-plot-in-one-picture/34372367#34372367

可以像平时画线更新data那样来更新bar的高

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation


fig=plt.figure(1,figsize=(4,3))
ax=fig.add_subplot(111)
ax.set_title('bar_animate_test')
#ax.set_xticks([])注释了这个是能看到变化,要不看不到变化,不对,能看到变化,去了注释吧
#ax.set_yticks([])
ax.set_xlabel('xlable')
N=5
frames=50
x=np.arange(1,N+1)

collection=[]
collection.append([i for i in x])
for i in range(frames):
    collection.append([ci+1 for ci in collection[i]])
print(collection)
xstd=[0,1,2,3,4]
bars=ax.bar(x,collection[0],0.30)
def animate(fi):
    # collection=[i+1 for i in x]
   ax.set_ylim(0,max(collection[fi])+3)#对于问题3,添加了这个
    for rect ,yi in zip(bars,collection[fi]):
        rect.set_height(yi)
    # bars.set_height(collection)
    return bars
anim=animation.FuncAnimation(fig,animate,frames=frames,interval=10,repeat=False)
plt.show()

  

  

问题

  *)TypeError: 'numpy.int32' object is not iterable

x=np.arange(1,N+1)
collection=[i for i in x] #collection=[i for i in list(x)]#错误的认为是dtype的原因,将这里改成了list(x) for i in range(frames): collection.append([ci+1 for ci in collection[i]])#问题的原因是因为此时的collection还是一个一位数组,所以这个collection[i]是一个x里的一个数,并不是一个列表,我竟然还以为的dtype的原因,又改了 xstd=[0,1,2,3,4]

  应该是

collection=[]
collection.append([i for i in x])#成为二维数组
for i in range(frames):
    collection.append([ci+1 for ci in collection[i]])

  然后又出现了下面的问题:

  *)TypeError: only size-1 arrays can be converted to Python scalars

Traceback (most recent call last):
  File "forTest.py", line 22, in <module>
    bars=ax.bar(x,collection,0.30)
  File "C:\Users\Administrator.SC-201605202132\Envs\sort\lib\site-packages\matplotlib\__init__.py", line 1589, in inner
    return func(ax, *map(sanitize_sequence, args), **kwargs)
  File "C:\Users\Administrator.SC-201605202132\Envs\sort\lib\site-packages\matplotlib\axes\_axes.py", line 2430, in bar
    label='_nolegend_',
  File "C:\Users\Administrator.SC-201605202132\Envs\sort\lib\site-packages\matplotlib\patches.py", line 707, in __init__
    Patch.__init__(self, **kwargs)
  File "C:\Users\Administrator.SC-201605202132\Envs\sort\lib\site-packages\matplotlib\patches.py", line 89, in __init__
    self.set_linewidth(linewidth)
  File "C:\Users\Administrator.SC-201605202132\Envs\sort\lib\site-packages\matplotlib\patches.py", line 368, in set_linewidth
    self._linewidth = float(w)
TypeError: only size-1 arrays can be converted to Python scalars

  参考链接:https://www.cnblogs.com/Summerio/p/9723099.html

  应该是传递的参数错误,仔细想了一下,在报错的代码行中,collection原来是没错的,因为原来是一维数组,现在变成二维了,改为

bars=ax.bar(x,collection[0],0.30)

  好了

   *)出现的问题,在上面的代码中,运行的时候不会画布的大小不会变,会又条形图溢出的情况,在animate()中添加了

def animate(fi):
    # collection=[i+1 for i in x]
    ax.set_ylim(0,max(collection[fi])+3)#添加了这个
    for rect ,yi in zip(bars,collection[fi]):
        rect.set_height(yi)

    # bars.set_height(collection)
    return bars

  

  

别的属性

  *)条形图是怎样控制间隔的:

  是通过控制宽度

width=1,#没有间隔,每个条形图会紧挨着

  *)errorbar:

  是加一个横线,能通过xerr和yerr来调整方向

xstd=[0,1,2,3,4]
bars=ax.bar(x,collection,0.30,xerr=xstd)

  

 

转载于:https://www.cnblogs.com/Gaoqiking/p/11261336.html

网站文章

  • selenium完成账号密码自动登录(以processOn为列)

    使用selenium控制浏览器完成processOn自动登录 实现思路 先初始化浏览器驱动-&gt;到登录页面-&gt;定位输入输出填入值-&gt;定位登录按钮模拟点击。 实现代码如下: # enco...

    2024-04-01 00:32:07
  • 别再唱衰Python了,未来十年Python的“霸榜”地位依旧!

    别再唱衰Python了,未来十年Python的“霸榜”地位依旧!

    直接说结论!不管唱反调的人怎么唱衰,Python 在下一个十年仍然十分重要,并且依旧会与时俱进。

    2024-04-01 00:32:00
  • LeetCode:240. Search a 2D Matrix II搜索二维矩阵 II(C语言)

    LeetCode:240. Search a 2D Matrix II搜索二维矩阵 II(C语言)

    题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例: 现有矩阵 ...

    2024-04-01 00:31:33
  • 因为它是在别处已打开 Word 无法保存此文件

    症状当您要打开 MicrosoftWord 中运行 Microsoft Visual Basic for Applications (VBA) 宏并以保存更改到 Word 文档, 然后出现以下错误信息: 因为它已打开其他地方 Word 无法保存此文件。 (/) // 服务器 共享 文件名 .doc /例如, 您运行 VBA 宏是类似于以下示例时可能出现此问题: Sub Test()Dim Wo

    2024-04-01 00:31:26
  • VB调用C++编写的dll(接口约定)

    dll示例代码// 32位编译(VS2017条件编译)#ifdef _M_IX86#pragma comment(linker, "/export:Send_Str_To_DLL_TEST=_Send...

    2024-04-01 00:30:53
  • 【笔记】CIOU公式

    【笔记】CIOU公式

    eg1: c = torch.tensor([[1.0000, 2.0000], [0.0000, 0.0000], [0.0000, 0.0000]]) print(torch.sum(torch.pow((c), 2), axis=0)) tensor([1., 4.]) c = torch.tensor([[1.0000, 2.0000],

    2024-04-01 00:30:47
  • jdk与jre的区别 热门推荐

    jdk与jre的区别 热门推荐

    首先笔者想阐明的是:JDK和JRE没想象中的那么简单。 相信大家都知道JDK和JRE是什么,但是具体干什么用不妨先试问下自己,如果能说出个所以然来,那么这篇文章大神请自觉忽略,呵呵,或者可以温故一下。 如果有哪里说的不对的地方还望指出,谢谢。 下面来简单说明下 先上张图,宏观的看一下 从图中可以看出JDK包含JRE包含JVM... JDK:java developmen...

    2024-04-01 00:30:43
  • Python经典面试题

    Python经典面试题

    一、Python经典面试题1、用你觉得最Python的方式来实现a、b元素交换a,b=b,a2、Python实现—个单例模式单例模式确保某一个类只有一个实例存在当你希望在整个系统中,某个类只能出现一个...

    2024-04-01 00:30:38
  • VS2019实用调试技巧

    VS2019实用调试技巧

    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。 Release 称为发布版本,编译器对我们写的代码进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,Release版本不能调试。

    2024-04-01 00:30:13
  • dependency walker工具简介及使用

    dependency walker工具简介及使用

    dependency walker工具简介及使用

    2024-04-01 00:30:06