重复使用底图而不重新填充

2024-04-24 12:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的数据集,想把整个数据集作为背景来绘制,然后通过在背景上进行子集和绘制来突出显示其中的过滤特征。我有这个工作的背景,每一次,但这是非常耗时的,因为我渲染了大约40个绘图的基础上。你知道吗

我的问题是,我似乎无法得到背景数据(第一散点图)留在原地。通过复制图形或尝试复制轴。你知道吗

完整功能代码示例:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


df = pd.DataFrame(
    {
        "x": np.random.normal(size=100),
        "y": np.random.rand(100),
        "thing_1": np.concatenate((np.ones(50), np.zeros(50))),
        "thing_2": np.concatenate((np.zeros(50), np.ones(50)))}
)

fig, ax = plt.subplots(figsize=(12, 8))


# This works but replots the background data each time (costly with the large datasets)
for thing in ['thing_1', 'thing_2']:

    ax.clear()
    # background data cloud  Reuse instead of plotting
    ax.scatter(df.x, df.y, c='grey', alpha=0.5, s=30)

    # subset to highlight
    ind = df[thing] == 1
    ax.scatter(df.loc[ind, 'x'], df.loc[ind, 'y'], c='red', alpha=1, s=15)

    plt.savefig('{}_filter.png'.format(thing))

我目前优化代码的最佳尝试:

# Want to do something like this (only plot background data once and copy the axis or figure)
fig_background, ax_background = plt.subplots(figsize=(12, 8))
ax_background.scatter(df.x, df.y, c='grey', alpha=0.5, s=30)

for thing in ['thing_1', 'thing_2']:
    fig_filter = fig_background

    axs = fig_filter.get_axes()

    # subset to highlight
    ind = df[thing] == 1
    axs[0].scatter(df.loc[ind, 'x'], df.loc[ind, 'y'], c='red', alpha=1, s=15)

    plt.savefig('{}_filter.png'.format(thing))

    plt.cla()

Tags: 数据importalphadfnpfigpltax
1条回答
网友
1楼 · 发布于 2024-04-24 12:17:08

在绘制新的循环步骤之前,可以删除每个循环步骤中的散点。你知道吗

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


df = pd.DataFrame(
    {
        "x": np.random.normal(size=100),
        "y": np.random.rand(100),
        "thing_1": np.concatenate((np.ones(50), np.zeros(50))),
        "thing_2": np.concatenate((np.zeros(50), np.ones(50)))}
)

fig, ax = plt.subplots(figsize=(12, 8))
# background data cloud
ax.scatter(df.x, df.y, c='grey', alpha=0.5, s=30)

scatter = None

for thing in ['thing_1', 'thing_2']:

    if scatter is not None:
        scatter.remove()

    # subset to highlight
    ind = df[thing] == 1
    scatter = ax.scatter(df.loc[ind, 'x'], df.loc[ind, 'y'], c='red', 
    alpha=1, s=15)

    plt.savefig('{}_filter.png'.format(thing))  

相关问题 更多 >