如何制作散点图动画
我正在尝试制作散点图的动画,其中点的颜色和大小在动画的不同阶段发生变化。对于数据,我有两个带有 x 值和 y 值的 numpy ndarray:
data.shape = (ntime, npoint)
x.shape = (npoint)
y.shape = (npoint)
现在我想绘制该类型的散点图
pylab.scatter(x,y,c=data[i,:])
并在索引 i
上创建动画。我该怎么做?
I'm trying to do an animation of a scatter plot where colors and size of the points changes at different stage of the animation. For data I have two numpy ndarray with an x value and y value:
data.shape = (ntime, npoint)
x.shape = (npoint)
y.shape = (npoint)
Now I want to plot a scatter plot of the type
pylab.scatter(x,y,c=data[i,:])
and create an animation over the index i
. How do I do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
假设您有一个散点图,
scat = ax.scatter(...)
,那么您可以更改位置
其中
array
是 x 和 y 坐标的N x 2
形状数组。更改尺寸
,其中
array
是尺寸以点为单位的一维数组。更改颜色
,其中
array
是将要进行颜色映射的一维值数组。下面是一个使用动画模块的简单示例。
它比实际需要的稍微复杂一些,但这应该为您提供一个框架来完成更奇特的事情。
(代码于 2019 年 4 月进行了编辑,以便与当前版本兼容。有关旧代码,请参阅修订历史记录) >
如果您使用 OSX 并使用 OSX 后端,则需要更改下面的
FuncAnimation
初始化中的blit=True
更改为blit=False
。 OSX 后端不完全支持位块传送。性能会受到影响,但该示例应该在禁用位块传输的 OSX 上正确运行。对于一个仅更新颜色的更简单的示例,请查看以下内容:
Suppose you have a scatter plot,
scat = ax.scatter(...)
, then you canchange the positions
where
array
is aN x 2
shaped array of x and y coordinates.change the sizes
where
array
is a 1D array of sizes in points.change the color
where
array
is a 1D array of values which will be colormapped.Here's a quick example using the animation module.
It's slightly more complex than it has to be, but this should give you a framework to do fancier things.
(Code edited April 2019 to be compatible with current versions. For the older code see revision history)
If you're on OSX and using the OSX backend, you'll need to change
blit=True
toblit=False
in theFuncAnimation
initialization below. The OSX backend doesn't fully support blitting. The performance will suffer, but the example should run correctly on OSX with blitting disabled.For a simpler example, which just updates the colors, have a look at the following:
我写了 celluloid 来使这更容易。通过示例显示可能是最简单的:
它在底层使用
ArtistAnimation
。camera.snap
捕获用于在动画中创建帧的图形的当前状态。编辑:为了量化它使用了多少内存,我通过 memory_profiler 运行它。
总结一下:
I wrote celluloid to make this easier. It's probably easiest to show by example:
It uses
ArtistAnimation
under the hood.camera.snap
captures the current state of the figure which is used to create the frames in the animation.Edit: To quantify how much memory this uses I ran it through memory_profiler.
To summarize this:
TL/DR:如果您在使用
ax.set_...
方法制作散点图动画时遇到问题,您可以尝试仅清除每帧的绘图(即,ax.clear()
) 并根据需要重新绘制内容。这较慢,但当您想在小动画中更改很多内容时可能会很有用。以下是演示这种“清晰”方法的示例:
我从 matplotlib 和其他来源看到的教程似乎没有使用这种方法,但我看到其他人(以及我自己)建议这样做这个网站。我看到了一些优点和缺点缺点,但我会欣赏其他人的想法:
优点
set_...
方法来绘制散点图(即.set_offsets()
、. set_sizes()
, ...),其中有更晦涩且不太详细的文档(尽管主要答案会让您走得很远!)。另外,不同的绘图类型有不同的方法(例如,您可以使用set_data
来绘制线条,但不能使用散点)。通过清除轴,您可以像 matplotlib 中的任何其他绘图一样确定每帧的绘制元素。设置
,例如标记类型(如注释)或颜色图。例如,由于标记和颜色图的更改,我不知道如何使用 ax.set_... 创建上述绘图。但这对于 ax.scatter() 来说是非常基本的。缺点
set...
方法更昂贵。所以对于大型动画来说,这种方法可能有点痛苦。update
中(否则它们将消失)。如果您希望更改某些内容,但其他内容保持不变,这可能会很烦人。当然,速度是一个很大的缺点。这是一个显示差异的示例。给定此数据:
您可以使用
set...
方法进行绘图:或“clear”方法:
要获取此图:
使用
%%time,我们可以看到清除和重新绘制需要(更多比)两倍长:
set...
:Wall time:1.33 s
Wall time: 2.73 s
使用
frames
参数在不同的比例下进行测试。对于较小的动画(较少的帧/数据),两种方法之间的时间差异无关紧要(对我来说,有时会导致我更喜欢清除方法)。但对于较大的情况,使用set_...
可以节省大量时间。TL/DR: If you are having trouble with the
ax.set_...
methods for animating your scatter plot, you can try to just clear the plot each frame (i.e.,ax.clear()
) and re-plot things as desired. This is slower, but might be useful when you want to change a lot of things in a small animation.Here is an example demonstrating this "clear" approach:
The tutorials I have seen from matplotlib and other sources do not seem to use this approach, but I have seen others (as well as myself) suggest it on this site. I see some pros & cons, but I would appreciate anyone else's thoughts:
Pros
set_...
methods for the scatter plot (i.e..set_offsets()
,.set_sizes()
, ...), which have more obscure and less-detailed documentation (though the leading answer will get you very far here!). Plus, there are different methods for different plot types (e.g. you useset_data
for lines, but not for scatter points). By clearing the axis, you determine the plotted elements each frame like any other plot in matplotlib.set
-able, such as the marker type (as commented) or the colormap. I wouldn't know how to create the above plot usingax.set_...
, for example, because of the marker and colormap changes. But this is pretty basic withax.scatter()
.Cons
set...
methods. So for large animations, this approach can be kind of painful.update
(else they will be gone). This can be annoying if you want some things to change, but others to stay the same.Of course, the speed is a big con. Here is an example showing the difference. Given this data:
You can plot using the
set...
method:Or the "clear" method:
To get this figure:
Using
%%time
, we can see that clearing and replotting takes (more than) twice as long:set...
:Wall time: 1.33 s
Wall time: 2.73 s
Play with the
frames
parameter to test this at different scales. For smaller animations (less frames/data), the time difference between the two methods is inconsequential (and for me, sometimes causes me to prefer the clearing method). But for larger cases, usingset_...
can save significant time.事情是这样的。我曾经是 Qt 和 Matlab 的用户,对 matplotlib 上的动画系统不太熟悉。
但我确实找到了一种方法,可以制作你想要的任何类型的动画,就像在 matlab 中一样。它真的很强大。无需检查模块引用,您就可以绘制任何您想要的内容。所以我希望它能有所帮助。
基本思想是使用 PyQt 内部的时间事件(我确信 Python 上的其他 Gui 系统如 wxPython 和 TraitUi 具有相同的内部机制来进行事件响应。但我只是不知道如何)。每次调用 PyQt 的 Timer 事件时,我都会刷新整个画布并重新绘制整个图片,我知道速度和性能可能会慢慢受到影响,但影响不大。
这是一个小例子:
您可以在
我就像你一样想使用动画散点图来制作排序动画。但我就是找不到所谓的“设置”功能。所以我刷新了整个画布。
希望有帮助..
Here is the thing. I used to a user of Qt and Matlab and I am not quite familiar with the animation system on the matplotlib.
But I do have find a way that can make any kind of animation you want just like it is in matlab. It is really powerful. No need to check the module references and you are good to plot anything you want. So I hope it can help.
The basic idea is to use the time event inside PyQt( I am sure other Gui system on the Python like wxPython and TraitUi has the same inner mechanism to make an event response. But I just don't know how). Every time a PyQt's Timer event is called I refresh the whole canvas and redraw the whole picture, I know the speed and performance may be slowly influenced but it is not that much.
Here is a little example of it:
You can adjust the refresh speed in the
I am just like you who want to use the Animated scatter plot to make a sorting animation. But I just cannot find a so called "set" function. So I refreshed the whole canva.
Hope it helps..
为什么不试试这个
Why Not try this