Hướng dẫn save plot as vector graphic python - lưu cốt truyện dưới dạng python đồ họa vector

Nếu bạn cần tệp EMF làm định dạng đầu ra, ví dụ: Để chèn các lô chất lượng cao vào MS Word/PowerPoint và bạn sẵn sàng sử dụng Inkscape làm bộ chuyển đổi, bạn có thể áp dụng giải pháp này:

from matplotlib import pyplot as plt
import subprocess, os

def plot_as_emf(figure, **kwargs):
    inkscape_path = kwargs.get('inkscape', "C://Program Files//Inkscape//inkscape.exe")
    filepath = kwargs.get('filename', None)

    if filepath is not None:
        path, filename = os.path.split(filepath)
        filename, extension = os.path.splitext(filename)

        svg_filepath = os.path.join(path, filename+'.svg')
        emf_filepath = os.path.join(path, filename+'.emf')

        figure.savefig(svg_filepath, format='svg')

        subprocess.call([inkscape_path, svg_filepath, '--export-emf', emf_filepath])
        os.remove(svg_filepath)

Để kiểm tra chức năng này, bạn có thể chạy một ví dụ đơn giản:

plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")

23 tháng 3 năm 2020

MATLAB hoặc MATPLOTLIB sẽ lưu định dạng Vector SVG độ phân giải vô hạn, có thể xem trong trình duyệt web. SVG có thể sử dụng được bằng latex.

  • Đồ họa vector (SVG hoặc EPS) cho phép phóng to gần như vô hạn mà không mất chất lượng của các lô hàng và các lô đường viền
  • SVG có thể xem được bởi bất kỳ trình duyệt web nào và có thể sử dụng được từ latex
  • EPS thường được sử dụng trong latex
  • PNG là đồ họa raster, do đó có độ phân giải hữu hạn (blocky)

Dưới đây là các ví dụ về các số liệu tiết kiệm cho SVG từ MATLAB và matplotlib.

Python

Để lưu tay cầm hình

plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")
1, chỉ cần làm
plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")
2.

from pathlib import Path
from matplotlib.figure imoprt Figure

fn = Path('~/Documents/mycoolfig.svg').expanduser()

data = [1,2,3,4]

fg = Figure()
ax = fg.gca()
ax.plot(data)

fg.savefig(fn, bbox_inches='tight')

Matlab

Số liệu MATLAB nói chung được lưu bởi xuất khẩu.

data = [1,2,3,4]

fg = figure();
plot(data)

exportgraphics(fg, 'matfig.svg')

27 tháng 3 năm 2021

Bài này là lỗi thời. Một hướng dẫn mới hơn có sẵn ở đây.

Matplotlib là một công cụ cực kỳ hữu ích để vẽ sơ đồ khoa học. Nhiều nhà nghiên cứu sử dụng nó để tạo ra các lô cho các ấn phẩm của họ. Tuy nhiên, Matplotlib sử dụng phông chữ Sans serif theo mặc định, điều này hiếm khi được sử dụng trong bất kỳ bài báo khoa học nào. Kết quả là, nếu một người chèn trực tiếp các số liệu từ matplotlib, nó sẽ kết thúc với một phong cách khác so với bài báo. Nó chắc chắn không phải là mọi thẩm mỹ. Trong bài đăng này, tôi thảo luận về cách điều chỉnh matplotlib của mình để nó tạo ra đồ họa vector chất lượng cao phù hợp với giấy latex của bạn.

Cách mủ cao nhất: Sử dụng phụ trợ PGF

Như tôi đã thảo luận trong bài viết trước đó, có thể sử dụng phụ trợ Matplotlib, PGF để tạo ra các số liệu vectơ. Bởi vì PGF có liên quan chặt chẽ với latex, các số liệu tạo ra theo cách này sẽ gần nhất với phong cách của các bài báo cao su. Một ví dụ được hiển thị như dưới đây:

import matplotlib
# switch to pgf backend
matplotlib.use('pgf')
# import matplotlib
import matplotlib.pyplot as plt

# update latex preamble
plt.rcParams.update({
    "font.family": "serif",
    "text.usetex": True,
    "pgf.rcfonts": False,
    "pgf.texsystem": 'pdflatex', # default is xetex
    "pgf.preamble": [
         r"\usepackage[T1]{fontenc}",
         r"\usepackage{mathpazo}"
         ]
})

Trong trường hợp này, các sơ đồ được chuyển đổi thành các lệnh PGF và được biên dịch với các trình biên dịch latex được tìm thấy trong hệ thống cục bộ. Có ba vấn đề lớn với phương pháp này:

  1. Thời gian tạo cốt truyện chậm hơn đáng kể so với các phụ trợ khác của Matplotlib.
  2. Khi phụ trợ PGF được sử dụng, matplotlib trở nên không tương tác. Đó là, chức năng
    plt.plot([1,2], [4,5])
    fig = plt.gcf()
    plot_as_emf(fig, filename="C:/test.emf")
    
    3 không thể được sử dụng nữa. Người ta chỉ có thể xuất các số liệu PDF với
    plt.plot([1,2], [4,5])
    fig = plt.gcf()
    plot_as_emf(fig, filename="C:/test.emf")
    
    4.
  3. Có một số lỗi trong phụ trợ PGF. Một số số liệu có thể dẫn đến lỗi biên dịch latex.

Cách tương tác nhiều hơn

Vì phụ trợ PGF có những nhược điểm đáng kể, tôi đã thực hiện một số nghiên cứu và tìm ra một cách tương tác khác để làm cho các ô matplotlib phù hợp với phong cách của các bài báo cao su. Chúng tôi vẫn cho rằng người dùng có phân phối latex hoàn chỉnh trên máy của mình. Lý do chính cho điều này là chúng tôi muốn sử dụng phông chữ latex. Chúng tôi cũng cho rằng người dùng chạy matplotlib với Jupyter Lab. Tôi phát hiện ra rằng quá trình này trở nên đặc biệt đơn giản khi Jupyter Lab được sử dụng. Tất nhiên, nó cũng hoạt động với các tệp python script.

Hầu hết các giấy tờ sử dụng phông chữ thời gian, chúng ta có thể xấp xỉ thời gian khá tốt với Tex Gyre Termes, đây là phông chữ được sử dụng trong gói newtxtext. Các bản phân phối latex được vận chuyển với phiên bản OpenType của Tex Gyremes, có thể được đưa trực tiếp vào các phụ trợ tương tác Matplotlib. Do đó, chúng ta có thể làm cho các phông chữ trong matplotlib giống như latex bằng cách sử dụng Tex Gyre Termes.

Chúng ta cũng cần thay đổi phông chữ toán Matplotlib, thành serif. Mặc dù thực tế là Tex Gyre có một phông chữ toán tương ứng, tôi đã tìm ra cách cho phép matplotlib sử dụng phông chữ toán học bên ngoài. Chúng ta chỉ có thể nói với Matplotlib để sử dụng một trong những phông chữ nội bộ của nó toán học, rất gần với phong cách của thời gian.

Chúng tôi sử dụng

plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")
5 để xác định vị trí thư mục gốc của latex và chúng tôi có thể thêm các phông chữ vào matplotlib với
plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")
6. Mã trông như thế này:

import os
import subprocess
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

kpse_cp = subprocess.run(['kpsewhich', '-var-value', 'TEXMFDIST'], capture_output=True, check=True)
font_loc1 = os.path.join(kpse_cp.stdout.decode('utf8').strip(), 'fonts', 'opentype', 'public', 'tex-gyre')
print(f'loading TeX Gyre fonts from "{font_loc1}"')
font_dirs = [font_loc1]
font_files = font_manager.findSystemFonts(fontpaths=font_dirs)
for font_file in font_files:
    font_manager.fontManager.addfont(font_file)

plt.rcParams['font.family'] = 'TeX Gyre Termes'
plt.rcParams["mathtext.fontset"] = "stix"

Khi chúng tôi đang sử dụng Jupyter Lab, chúng tôi có thể đặt định dạng đầu ra sơ đồ thành

plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")
7, đây là định dạng đồ họa vector.

from IPython.display import set_matplotlib_formats
set_matplotlib_formats('svg')

Kết hợp hai khối mã này, chúng ta có thể vẽ một hàm sin như sau:

import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.show()

Chúng ta có thể lưu hình ảnh

plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")
7 này bằng cách thay đổi+nhấp chuột phải vào biểu đồ.

Cốt truyện trông giống như thế này. Nó đã là đồ họa vector cho phép bạn phóng to thực sự gần!

Để sử dụng hình ảnh này trong latex, chúng ta cần sử dụng gói SVG, sử dụng Inkscape để chuyển đổi các tệp SVG thành PDF cho latex để bao gồm chúng.

\documentclass{article}
\usepackage{svg}

\begin{document}
\includesvg[width=0.5\linewidth]{my-svg.svg}
\end{document}

Hạn chế chính của phương pháp này là nội dung trong chế độ toán học trông không đẹp lắm. Nó cũng không phông chữ toán bên ngoài.

Chọn phương pháp nhúng phông chữ SVG

Theo tài liệu, có một số cách để nhúng phông chữ vào tệp SVG:

#svg.fonttype : 'path'         # How to handle SVG fonts:
#    'none': Assume fonts are installed on the machine where the SVG will be viewed.
#    'path': Embed characters as paths -- supported by most SVG renderers
#    'svgfont': Embed characters as SVG fonts -- supported only by Chrome,
#               Opera and Safari

Theo mặc định, phông chữ được nhúng dưới dạng đường cong. Hành vi này có thể được thay đổi với:

plt.plot([1,2], [4,5])
fig = plt.gcf()
plot_as_emf(fig, filename="C:/test.emf")
0

Chúng ta có thể vẽ đồ thị biểu đồ vector trong Python không?

Trong bài viết này, chúng tôi sẽ thảo luận về cách vẽ một trường vector trong Python.Để thực hiện nhiệm vụ này, chúng tôi sẽ sử dụng phương thức run () và phương thức streamplot () trong mô -đun matplotlib.Trong đó x, y xác định vị trí vectơ và u, v là các mũi tên định hướng đối với vị trí vectơ.use the quiver() method and the streamplot() method in matplotlib module. Where X, Y define the Vector location and U, V are directional arrows with respect of the Vector location.

Chúng ta có thể cứu một âm mưu trong Python không?

Các sơ đồ matplotlib có thể được lưu dưới dạng tệp hình ảnh bằng hàm plt.savefig ().Plt. savefig() function. The plt.

Làm thế nào để một máy tính vẽ một đồ họa vector?

Đồ họa vector là hình ảnh máy tính được tạo bằng một chuỗi các lệnh hoặc câu lệnh toán học đặt các đường và hình dạng trong một không gian hai chiều hoặc ba chiều.Trong Vector Graphics, tác phẩm hoặc tệp của một nghệ sĩ đồ họa, được tạo và lưu dưới dạng một chuỗi các câu lệnh vector.using a sequence of commands or mathematical statements that place lines and shapes in a two-dimensional or three-dimensional space. In vector graphics, a graphic artist's work, or file, is created and saved as a sequence of vector statements.