我是python的新手(来自matlab)。作为一个项目,我试图创建一个随时间变化的相关矩阵的动画图。为了让情节变得美好,我正在尝试海盗。我很难完成动画制作(在mac上遇到matplotlib后端问题),但现在使用来自网络的代码可以使用非常基本的动画:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
nx = 50
ny = 50
fig = plt.figure()
data = np.random.rand(nx, ny)
im = plt.imshow(data)
def init():
im.set_data(np.zeros((nx, ny)))
def animate(i):
#xi = i // ny
#yi = i % ny
data = np.random.rand(nx, ny)
im.set_data(data)
return im
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=50, repeat = False)
现在我试图将其改编为seaborn,但没有成功。似乎seaborn在次要情节上工作并且使这些动画变得更加困难。我得到的最好的东西是一种递归情节,其中seaborn.heatmaps被绘制在彼此之上。此外,im.set_data方法不可用。 任何建议都非常感谢。 非常感谢你。
最好,拉尔夫。
答案 0 :(得分:3)
好点,mwaskom(感谢sns中的所有工作!) - 这就是我被困住的地方。我用seaborn.heatmap替换了plt.imshow(使用set_data生成数据)。
fig = plt.figure()
data = np.random.rand(nx, ny)
sns.heatmap(data, vmax=.8, square=True)
def init():
sns.heatmap(np.zeros((nx, ny)), vmax=.8, square=True)
def animate(i):
data = np.random.rand(nx, ny)
sns.heatmap(data, vmax=.8, square=True)
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=20, repeat = False)
这创造了我挣扎的递归情节。感谢您的帮助,使绘图更漂亮,希望很快也更容易! 最好的,拉尔夫。
答案 1 :(得分:0)
这是一个完整的示例(已通过Matplotlib 3.0.3测试)。
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
def animate_heat_map():
fig = plt.figure()
nx = ny = 20
data = np.random.rand(nx, ny)
ax = sns.heatmap(data, vmin=0, vmax=1)
def init():
plt.clf()
ax = sns.heatmap(data, vmin=0, vmax=1)
def animate(i):
plt.clf()
data = np.random.rand(nx, ny)
ax = sns.heatmap(data, vmin=0, vmax=1)
anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1000)
plt.show()
if __name__ == "__main__":
animate_heat_map()
答案 2 :(得分:0)
基于r schmaelzle的答案,我用注释创建了动画的Seaborn热图。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import animation
class Heatmap:
def __init__(self):
self.fig, self.ax = plt.subplots()
self.anim = None
def animate(self):
def init():
sns.heatmap(np.zeros((10, 10)), vmax=.8, ax=self.ax)
def animate(i):
self.ax.texts = []
sns.heatmap(np.random.rand(10, 10), annot=True, vmax=.8, cbar=False, ax=self.ax)
self.anim = animation.FuncAnimation(self.fig, animate, init_func=init, frames=20, repeat=False)
if __name__ == '__main__':
hm = Heatmap()
hm.animate()
更新注释的技巧是使空ax.texts = []
。
我希望它将对他人有所帮助! :)
答案 3 :(得分:0)
除了你上面的回答,我想从数据框列表中做到这一点并保存为 gif。因此,使用您的代码和 Serenity 对 Matplotlib animation iterating over list of pandas dataframes
的回答const {users, setUsers, horizontalDiscussion, setHorizontalDiscussion} = useContext(UserContext);
谢谢!!!