Matplotlib 输出为 PDF 用于 Corel Draw

Matplotlib output to PDF for Corel Draw

更新:字体问题实际上是通过使用 rc("pdf", fonttype=42) 解决的,但不幸的是它与另一个结合使用 - 无论何时使用任何类型我尝试使用 CorelDraw 的标记出现错误 "File is corrupted"。

当我将我的图表从 Matplotlib 输出为 PDF 时,我无法在 Corel Draw 中打开它。我高度怀疑主要问题可能出在文本/字体上。

我需要更新的简单代码示例,以便在 Corel Draw 中正确导入带有文本和标记的 PDF:

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
from matplotlib import rc
rc("pdf", fonttype=42)

with PdfPages("simple.pdf") as pdf:
  points_y = points_x = [1,2,3]
  plt.plot(points_x, points_y, marker="o")
  pdf.savefig()
  plt.close()

Corel 与 Matplotlib/PDF 的示例 Reader 未使用 rc("pdf", fonttype=42) 和标记时。如果使用标记的 PDF 无法打开并且 CorelDraw 显示 "File is corrupted"。

事实证明,有两个重要问题破坏了将 Matplotlib 生成的 PDF 导入 CorelDraw 的过程。

  1. 设置字体类型从默认的rc("pdf", fonttype=3)rc("pdf", fonttype=42)
  2. 不使用多个标记。每个地块只允许一个标记!可以用文本替换。(没有 pyplot.scatter,不在 pyplot.plot 等)。当每个绘图使用 2 个或更多数量的任何标记时,CorelDraw 发现 PDF 已损坏并且根本无法打开它。

重写代码以在每个图上仅绘制一个标记,在图例中仅绘制一个标记:

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
from matplotlib import rc
rc("pdf", fonttype=42)

with PdfPages("simple.pdf") as pdf:
    points_y = points_x = [1,2,3]
    plt.plot(points_x, points_y,color="r")
    # plot points one be one otherwise "File is corrupted" in CorelDraw
    # also plot first point out of loop to make appropriate legend
    plt.plot(points_x[0], points_y[0],marker="o",color="r",markerfacecolor="b",label="Legend label")
    for i in range(1,len(points_x)):
        plt.plot(points_x[i], points_y[i],marker="o",markerfacecolor="b")
    plt.legend(numpoints=1) #Only 1 point in legend because in CorelDraw "File is corrupted" if default two or more 
    pdf.savefig()
    plt.close()

作为点(标记)的可能替代品,可以使用 pyplot.text,对于我的示例,更新后的代码如下所示:

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
from matplotlib import rc
rc("pdf", fonttype=42)

with PdfPages("simple.pdf") as pdf:
    points_y = points_x = [1,2,3]
    plt.plot(points_x, points_y)
    # print points as + symbol
    for i in range(len(points_x)):
        plt.text(points_x[i], points_y[i],"+",ha="center", va="center")
    pdf.savefig()
    plt.close()