lưu hình ảnh trong python ở chất lượng rất cao


109

Làm cách nào để lưu các lô python với chất lượng rất cao?

Tức là khi mình cứ phóng to đối tượng lưu trong file pdf thì không bị mờ?

Ngoài ra, đâu sẽ là chế độ tốt nhất để lưu nó vào?

png, eps? Hoặc một số khác? Tôi không thể làm được pdfvì có một số ẩn xảy ra sự lộn xộn với việc Latexmkbiên dịch.

Câu trả lời:


153

Nếu bạn đang sử dụng matplotlibvà cố gắng có được các số liệu tốt trong một tài liệu latex, hãy lưu dưới dạng eps. Cụ thể, hãy thử một cái gì đó như thế này sau khi chạy các lệnh để vẽ hình ảnh:

plt.savefig('destination_path.eps', format='eps')

Tôi nhận thấy rằng các tệp eps hoạt động tốt nhất và dpitham số là thứ thực sự khiến chúng trông đẹp trong một tài liệu.

CẬP NHẬT:

Để chỉ định hướng của hình trước khi lưu, chỉ cần gọi phần sau trước khi plt.savefiggọi, nhưng sau khi tạo biểu đồ (giả sử bạn đã vẽ biểu đồ bằng cách sử dụng một trục có tên ax):

ax.view_init(elev=elevation_angle, azim=azimuthal_angle)

Trong đó elevation_anglemột số (tính bằng độ) xác định góc cực (hướng xuống từ trục z thẳng đứng) và số azimuthal_anglechỉ định góc phương vị (xung quanh trục z).

Tôi thấy rằng dễ nhất để xác định các giá trị này bằng cách vẽ biểu đồ hình ảnh trước tiên, sau đó xoay nó và xem các giá trị hiện tại của các góc xuất hiện về phía dưới cùng của cửa sổ ngay bên dưới biểu đồ thực tế. Hãy nhớ rằng các vị trí x, y, z, xuất hiện theo mặc định, nhưng được thay thế bằng hai góc khi bạn bắt đầu nhấp + kéo + xoay hình ảnh.


@ spencerlon2 nếu tôi muốn thay đổi hướng của hình trước khi lưu thì sao?
dustin

13
Tại sao chúng ta cần tham số DPI? Không phải eps là một định dạng vectơ?
mkvoya

1
Điểm tốt - DPI không cần thiết đối với các định dạng vectơ như svg, pdf, eps
spencerlyon2 Ngày

Bạn có thể bỏ qua format='eps'nếu bạn muốn. Trong trường hợp này, định dạng được suy ra từ tên tệp.
timgeb

72

Chỉ để thêm kết quả của tôi, cũng sử dụng matplotlib.

.eps làm cho tất cả văn bản của tôi được in đậm và loại bỏ độ trong suốt. .svg đã cung cấp cho tôi những bức ảnh có độ phân giải cao trông giống như biểu đồ của tôi.

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# Do the plot code
fig.savefig('myimage.svg', format='svg', dpi=1200)

Tôi đã sử dụng 1200 dpi vì rất nhiều tạp chí khoa học yêu cầu hình ảnh ở 1200/600/300 dpi tùy thuộc vào nội dung của hình ảnh. Chuyển đổi sang định dạng và dpi mong muốn trong GiMP hoặc Inkscape.

CHỈNH SỬA: Rõ ràng là dpi không quan trọng vì .svg là đồ họa vector và có "độ phân giải vô hạn".


2
DPI rất quan trọng khi chúng ta sử dụng imshow(..)một nơi nào đó trên hình. Các bitmap này được đánh dấu hoa thị khi chúng được nhúng vào SVG. Với DPI mặc định, kết quả thậm chí còn tệ hơn những gì chúng ta thấy trên màn hình, chắc chắn không phù hợp với các ấn phẩm.
Evgeni Sergeev

Tôi cũng thực sự khuyên bạn nên dùng Scour ( github.com/scour-project/scour ) để giảm kích thước tệp svg của bạn. Ở cài đặt tích cực nhất, tôi có thể giảm kích thước tệp của mình xuống 50% so với kích thước ban đầu - 5% nếu tôi sử dụng định dạng nén .svgz.
grofte

8

Được rồi, tôi thấy câu trả lời của spencerlyon2 đang hoạt động, tuy nhiên trong trường hợp có ai đó sẽ thấy mình không biết phải làm gì với một dòng đó, tôi phải làm theo cách này:

beingsaved = plt.figure()

# some scatters
plt.scatter(X_1_x, X_1_y)
plt.scatter(X_2_x, X_2_y)

beingsaved.savefig('destination_path.eps', format='eps', dpi=1000)

6

Trong trường hợp bạn đang làm việc với sanh ở biển lô, thay vì matplotlib, bạn có thể tiết kiệm một hình ảnh .png như thế này:

Giả sử bạn có một matrixđối tượng (gấu trúc hoặc numpy) và bạn muốn chụp bản đồ nhiệt:

import seaborn as sb

image = sb.heatmap(matrix)   # this gets you the heatmap
image.figure.savefig("C:/Your/Path/ ... /your_image.png")   # this saves it

Mã này tương thích với phiên bản mới nhất của seaborn. Các mã khác xung quanh stackoverflow chỉ hoạt động cho các phiên bản trước.

Một cách khác mà tôi thích là thế này. Tôi đặt kích thước của hình ảnh tiếp theo như sau:

plt.subplots(figsize=(15,15))

Và sau đó, tôi vẽ biểu đồ đầu ra trong bảng điều khiển, từ đó tôi có thể sao chép và dán nó vào nơi tôi muốn. (Vì seaborn được xây dựng trên matplotlib, nên sẽ không có vấn đề gì.)


5

Bạn có thể lưu vào con số 1920x1080 (hoặc 1080p) bằng cách sử dụng:

fig = plt.figure(figsize=(19.20,10.80))

Bạn cũng có thể đi cao hơn hoặc thấp hơn nhiều. Các giải pháp trên hoạt động tốt để in, nhưng ngày nay bạn muốn hình ảnh được tạo thành PNG / JPG hoặc xuất hiện ở định dạng màn hình rộng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.