Pdf matplotlib中包含大量数据点的图形

Pdf matplotlib中包含大量数据点的图形,pdf,matplotlib,pdf-generation,Pdf,Matplotlib,Pdf Generation,我使用matplotlib(png格式)生成了附加图像。我想使用eps或pdf,但我发现对于所有数据点,图形在屏幕上的渲染速度非常慢。除了打印更少的数据外,是否还有其他方法对其进行优化以使其加载更快 我想你有三个选择: 正如您所提到的,您可以绘制更少的点。对于你在问题中展示的情节,我认为只每隔一点绘制一次就可以了 正如@tcaswell在其评论中所述,您可以使用线条而不是点,这样可以更有效地渲染 你可以把蓝点光栅化。Matplotlib允许您有选择地光栅化单个美工师,因此,如果将光栅化=True

我使用matplotlib(png格式)生成了附加图像。我想使用eps或pdf,但我发现对于所有数据点,图形在屏幕上的渲染速度非常慢。除了打印更少的数据外,是否还有其他方法对其进行优化以使其加载更快


我想你有三个选择:

  • 正如您所提到的,您可以绘制更少的点。对于你在问题中展示的情节,我认为只每隔一点绘制一次就可以了

  • 正如@tcaswell在其评论中所述,您可以使用线条而不是点,这样可以更有效地渲染

  • 你可以把蓝点光栅化。Matplotlib允许您有选择地光栅化单个美工师,因此,如果将
    光栅化=True
    传递给plotting命令,您将获得输出文件中点的位图版本。由于位图的分辨率,以有限的缩放为代价加载速度会快得多。(请注意,轴和绘图的所有其他元素将保留为矢量图形和字体元素)


  • 首先,如果要在绘图中显示“趋势”,并且考虑到正在绘制的x,y阵列是“巨大的”,可以将随机子采样应用于x,y阵列,作为数据的一部分:

    import numpy as np
    import matplotlib.pyplot as plt
    
    fraction = 0.50
    x_resampled = []
    y_resampled = []
    
    for k in range(0,len(x)):
       if np.random.rand() < fraction:
           x_resampled.append(x[k])
           y_resampled.append(y[k])
    
    plt.scatter(x_resampled,y_resampled , s=6)
    plt.show()
    
    将numpy导入为np
    将matplotlib.pyplot作为plt导入
    分数=0.50
    x_重采样=[]
    y_重采样=[]
    对于范围(0,len(x))中的k:
    如果np.random.rand()小于分数:
    x_重采样。追加(x[k])
    y_重采样。追加(y[k])
    plt.散射(x_重采样,y_重采样,s=6)
    plt.show()
    

    第二,您是否考虑过在x轴上使用对数比例来增加可见性?

    在本例中,只有打印区域被光栅化,轴仍为矢量格式:

    将numpy导入为np
    将matplotlib.pyplot作为plt导入
    x=np.随机.均匀(尺寸=400000)
    y=np.随机.均匀(尺寸=400000)
    plt.scatter(x,y,marker='x',光栅化=假)
    plt.savefig(“norm.pdf”,format='pdf')
    

    如果您使用直线
    -
    而不是点(假设这是
    绘图
    而不是
    散布
    ),直线简化代码可能会帮助您。如果你真的想要你所有的点,那么点,你有点像在向量的后端一样,你或多或少有命令“移动到x,y;画标记;移动到…”为每个点。可能重复的循环似乎很慢。尝试
    x_subsampled=x[np.random.rand(*x.shape)