Matplotlib - Làm thế nào để vẽ một đồ thị có độ phân giải cao?


81

Tôi đã sử dụng matplotlib để vẽ một số kết quả thử nghiệm (đã thảo luận ở đây: Vòng qua các tệp và vẽ biểu đồ . Tuy nhiên, lưu hình ảnh bằng cách nhấp chuột phải vào hình ảnh sẽ cho hình ảnh chất lượng rất tệ / độ phân giải thấp.

from glob import glob
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# loop over all files in the current directory ending with .txt
for fname in glob("./*.txt"):
    # read file, skip header (1 line) and unpack into 3 variables
    WL, ABS, T = np.genfromtxt(fname, skip_header=1, unpack=True)

    # first plot
    plt.plot(WL, T, label='BN', color='blue')

    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylim(0,100)
    plt.ylabel('Transmittance, %')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend(loc='lower center')
    plt.title('')
    plt.show()
    plt.clf()


    # second plot
    plt.plot(WL, ABS, label='BN', color='red')
    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylabel('Absorbance, A')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend()
    plt.title('')
    plt.show()
    plt.clf()

Biểu đồ ví dụ về những gì tôi đang tìm kiếm: biểu đồ ví dụ

Câu trả lời:


116

Bạn có thể sử dụng savefig()để xuất sang tệp hình ảnh:

plt.savefig('filename.png')

Ngoài ra, bạn có thể chỉ định dpiđối số cho một số giá trị vô hướng, ví dụ:

plt.savefig('filename.png', dpi=300)

Tôi không thể chỉ định tên tệp như vậy. Tập lệnh đi qua các tệp trong 'fname in perf ("./*. Txt")'.
esilik

gọi các tập tin bất cứ điều gì bạn thích
Ohad Eytan

Nó sẽ ghi đè lên dữ liệu 'và sẽ chỉ đưa ra hai bức ảnh. Phải không? Mục đích của tôi là có được hai biểu đồ cho mỗi tệp văn bản.
esilik

Vì vậy, bạn có thể làm một cái gì đó giống như plt.savefig(fname + 'Graph1.png')plt.savefig(fname + 'Graph2.png')
Ohad Eytan

Tuyệt quá! plt.savefig (fname + 'Graph1a.png', dpi = 600) cho đồ thị đầu tiên và plt.savefig (fname + 'Graph1a.png', dpi = 600) cho đồ thị thứ hai đã giải quyết được vấn đề. Cảm ơn!
esilik

33

sử dụng plt.figure(dpi=1200)trước tất cả plt.plot...và khi sử dụng cuối cùng, plt.savefig(...hãy xem: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figurehttp://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig


@deepfriedcyanide đã giúp tôi trong câu hỏi cũ của mình bằng cách nói: " Đối số tên tệp cho savefig chỉ là một chuỗi để bạn có thể thực hiện điều gì đó như: plt.savefig ('folder / file% d.png'% n) với một đối số mà bạn đếm lên sau mỗi âm mưu. "Nhưng tôi vẫn chưa hiểu. Tôi nên đặt mã này ở đâu trong tập lệnh của mình và làm thế nào?
esilik

1
Tuyệt vời, điều này làm việc cho tôi! bây giờ các âm mưu của tôi ở 4K XD
Gonzalo Garcia

21

Bạn có thể lưu biểu đồ của mình dưới dạng svg với chất lượng không mất dữ liệu:

import matplotlib.pylab as plt

x = range(10)

plt.figure()
plt.plot(x,x)
plt.savefig("graph.svg")

3
Bạn cũng có thể lưu dưới dạng PDF plt.savefig("graph.pdf")cũng không mất dữ liệu
Danny

3

Đối với những độc giả tương lai đã tìm thấy câu hỏi này trong khi cố gắng lưu hình ảnh có độ phân giải cao từ matplotlib như tôi, tôi đã thử một số câu trả lời ở trên và những nơi khác, và tổng hợp chúng ở đây.

Kết quả tốt nhất :plt.savefig('filename.pdf')

và sau đó chuyển đổi pdf này thành png trên dòng lệnh để bạn có thể sử dụng nó trong powerpoint:

pdftoppm -png -r 300 filename.pdf filename

Bài kiểm tra số 1 kém thành công hơn :plt.savefig('filename.png', dpi=300)

Điều này giúp lưu hình ảnh ở độ phân giải cao hơn một chút so với độ phân giải bình thường, nhưng nó không đủ cao để xuất bản hoặc một số bản trình bày. Sử dụng giá trị dpi lên đến 2000 vẫn tạo ra hình ảnh mờ khi xem cận cảnh.

Bài kiểm tra số 2 kém thành công hơn :plt.savefig('filename.pdf')

Không thể mở điều này trong Microsoft Office Professional Plus 2016 (vì vậy không có powerpoint), tương tự với Google Trang trình bày.

Bài kiểm tra số 3 kém thành công hơn :plt.savefig('filename.svg')

Điều này cũng không thể mở trong powerpoint hoặc Google Trang trình bày, với sự cố tương tự như trên.

Bài kiểm tra số 4 kém thành công hơn :plt.savefig('filename.pdf')

và sau đó chuyển đổi thành png trên dòng lệnh:

convert -density 300 filename.pdf filename.png

nhưng cái này vẫn quá mờ khi nhìn cận cảnh.

Bài kiểm tra số 5 kém thành công hơn :plt.savefig('filename.pdf')

và mở trong GIMP và xuất dưới dạng png chất lượng cao (đã tăng kích thước tệp từ ~ 100 KB lên ~ 75 MB)

Bài kiểm tra số 6 kém thành công hơn :plt.savefig('filename.pdf')

và sau đó chuyển đổi thành jpeg trên dòng lệnh:

pdfimages -j filename.pdf filename

Điều này không tạo ra bất kỳ lỗi nào nhưng không tạo ra kết quả trên Ubuntu ngay cả sau khi thay đổi xung quanh một số tham số.


2

Để lưu biểu đồ:

matplotlib.rcParams['savefig.dpi'] = 300

Để hiển thị biểu đồ khi bạn sử dụng plt.show():

matplotlib.rcParams["figure.dpi"] = 100

Chỉ cần thêm chúng ở đầu


0

Ở cuối vòng lặp for () , bạn có thể sử dụng savefig()hàm thay vì plt.show () và đặt tên, dpi và định dạng của hình của bạn.

Ví dụ: 1000 dpi và định dạng eps có chất lượng khá tốt, và nếu bạn muốn lưu mọi ảnh tại thư mục ./ với tên 'Sample1.eps', 'Sample2.eps', v.v., bạn có thể thêm mã sau:

for fname in glob("./*.txt"):
    # Your previous code goes here
    [...]

    plt.savefig("./{}.eps".format(fname), bbox_inches='tight', format='eps', dpi=1000)
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.