社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

厉害了,用Python绘制动态可视化图表,并保存成gif格式

机器学习初学者 • 3 年前 • 255 次点击  
有粉丝问道说“是不是可以将这些动态的可视化图表保存成gif图”,小编立马就回复了说后面会写一篇相关的文章来介绍如何进行保存gif格式的文件。那么我们就开始进入主题,来谈一下Python当中的gif模块。

安装相关的模块

首先第一步的话我们需要安装相关的模块,通过pip命令来安装
pip install gif
另外由于gif模块之后会被当做是装饰器放在绘制可视化图表的函数上,主要我们依赖的还是Python当中绘制可视化图表的matplotlibplotly、以及altair这些模块,因此我们还需要下面这几个库
pip install "gif[altair]"     
pip install "gif[matplotlib]"
pip install "gif[plotly]"

gifmatplotlib的结合

我们先来看gifmatplotlib模块的结合,我们先来看一个简单的例子,代码如下
import random
from matplotlib import pyplot as plt
import gif

x = [random.randint(0, 100) for _ in range(100)]
y = [random.randint(0, 100) for _ in range(100)]

gif.options.matplotlib["dpi"] = 300

@gif.frame
def plot(i):
    xi = x[i*10:(i+1)*10]
    yi = y[i*10:(i+1)*10]
    plt.scatter(xi, yi)
    plt.xlim((0, 100))
    plt.ylim((0, 100))

frames = []
for i in range(10):
    frame = plot(i)
    frames.append(frame)

gif.save(frames, 'example.gif', duration=3.5, unit="s", between="startend")
output

代码的逻辑并不难理解,首先我们需要定义一个函数来绘制图表并且带上gif装饰器,接着我们需要一个空的列表,通过for循环将绘制出来的对象放到这个空列表当中然后保存成gif格式的文件即可。

gifplotly的结合

除了和matplotlib的联用之外,gif plotly之间也可以结合起来用,代码如下
import random
import plotly.graph_objects as go
import pandas as pd
import gif

df = pd.DataFrame({
    't': list(range(10)) * 10,
    'x': [random.randint(0, 100) for _ in range(100)],
    'y': [random.randint(0, 100) for _ in range(100)]
})

@gif.frame
def plot(i):
    d = df[df['t'] == i]
    fig = go.Figure()
    fig.add_trace(go.Scatter(
        x=d["x"],
        y=d["y"],
        mode="markers"
    ))
    fig.update_layout(width=500, height=300)
    return fig

frames = []
for i in range(10):
    frame = plot(i)
    frames.append(frame)

gif.save(frames, 'example_plotly.gif', duration=100)
output

整体的代码逻辑和上面的相似,这里也就不做具体的说明了

matplotlib多子图动态可视化

上面绘制出来的图表都是在单张图表当中进行的,那当然了我们还可以在多张子图中进行动态可视化的展示,代码如下
# 读取数据
df = pd.read_csv('weather_hourly_darksky.csv')
df = df.rename(columns={"time""date"})

@gif.frame
def plot(df, date):
    df = df.loc[df.index[0]:pd.Timestamp(date)]

    fig, (ax1, ax2, ax3) = plt.subplots(3, figsize=(10, 6), dpi=100)

    ax1.plot(df.temperature, marker='o', linestyle='--', linewidth=1, markersize=3, color='g')
    maxi = round(df.temperature.max() + 3)
    ax1.set_xlim([START, END])
    ax1.set_ylim([0, maxi])
    ax1.set_ylabel('TEMPERATURE', color='green')

    ax2.plot(df.windSpeed, marker='o', linestyle='--', linewidth=1, markersize=3, color='b')
    maxi = round(df.windSpeed.max() + 3)
    ax2.set_xlim([START, END])
    ax2.set_ylim([0, maxi])
    ax2.set_ylabel('WIND', color='blue')

    ax3.plot(df.visibility, marker='o', linestyle='--', linewidth=1, markersize=3, color='r')
    maxi = round(df.visibility.max() + 3)
    ax3.set_xlim([START, END])
    ax3.set_ylim([0, maxi])
    ax3.set_ylabel('VISIBILITY', color='red')

frames = []
for date in pd.date_range(start=df.index[0], end=df.index[-1], freq='1M'):
    frame = plot(df, date)
    frames.append(frame)

gif.save(frames, "文件名称.gif", duration=0.5, unit='s')
output

动态气泡图

最后我们用plotly模块来绘制一个动态的气泡图,代码如下
import gif
import plotly.graph_objects as go
import numpy as np
np.random.seed(1)

N = 100
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
sz = np.random.rand(N) * 30

layout = go.Layout(
    xaxis={'range': [-2, 2]},
    yaxis={'range': [-2, 2]},
    margin=dict(l=10, r=10, t=10, b=10)
)

@gif.frame
def plot(i):
    fig = go.Figure(layout=layout)
    fig.add_trace(go.Scatter(
        x=x[:i],
        y=y[:i],
        mode="markers",
        marker=go.scatter.Marker(
            size=sz[:i],
            color=colors[:i],
            opacity=0.6,
            colorscale="Viridis"
        )
    ))
    fig.update_layout(width=500, height=300)
    return fig

frames = []
for i in range(100):
    frame = plot(i)
    frames.append(frame)

gif.save(frames,  "bubble.gif")
output


往期精彩回顾





Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/127497
 
255 次点击