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 的过程。
- 设置字体类型从默认的
rc("pdf", fonttype=3)
到rc("pdf", fonttype=42)
- 不使用多个标记。每个地块只允许一个标记!可以用文本替换。(没有 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()
更新:字体问题实际上是通过使用 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 的过程。
- 设置字体类型从默认的
rc("pdf", fonttype=3)
到rc("pdf", fonttype=42)
- 不使用多个标记。每个地块只允许一个标记!可以用文本替换。(没有 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()