Matplotlib - Як побудувати графік із високою роздільною здатністю?


87

Я використовував matplotlib для побудови деяких експериментальних результатів (обговорювали це тут: Зациклювання файлів та побудова графіків . Однак збереження зображення, клацнувши правою кнопкою миші, дає дуже погану якість / низьку роздільну здатність.

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()

Приклад графіка того, що я шукаю: приклад графіка

Відповіді:


125

Ви можете використовувати savefig()для експорту у файл зображення:

plt.savefig('filename.png')

Крім того, ви можете вказати dpiаргумент для якогось скалярного значення, наприклад:

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

Я не можу вказати ім'я файлу таким чином. Сценарій проходить через файли у 'fname in glob ("./*. Txt")'.
esilik

називайте файл як завгодно
Охад Ейтан

Він перезапише дані і дасть лише два зображення. Чи не так? Моя мета - отримати два графіки для кожного текстового файлу.
esilik

Тож ви можете зробити щось на кшталт plt.savefig(fname + 'Graph1.png')іplt.savefig(fname + 'Graph2.png')
Охад Ейтан

Чудово! plt.savefig (fname + 'Graph1a.png', dpi = 600) для першого графіку та plt.savefig (fname + 'Graph1a.png', dpi = 600) для другого, вирішили проблему. Дякую!
esilik

35

використовувати , plt.figure(dpi=1200)перш ніж всі ваші plt.plot...і в кінці використання plt.savefig(...см: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figure і http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig


@deepfriedcyanide допоміг мені у моєму старому запитанні, сказавши: " Аргумент імені файлу для savefig - це просто рядок, тому ви можете зробити щось на зразок: plt.savefig ('папка / файл% d.png'% n) із тим, який ви підрахуєте після кожного сюжету ". Але я ще не розумію ідеї. Де я повинен розміщувати ці коди у своєму сценарії та як?
esilik

1
Чудово, це спрацювало для мене! зараз мої сюжети в 4K XD
Гонсало Гарсія

23

Ви можете зберегти свій графік як svg для якості без втрат:

import matplotlib.pylab as plt

x = range(10)

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

5
Ви також можете зберегти як PDF, plt.savefig("graph.pdf")що також не
Денні

6

Для майбутніх читачів, які знайшли це питання, намагаючись зберегти зображення з високою роздільною здатністю з matplotlib, як я є, я спробував деякі відповіді вище та в інших місцях, і підсумував їх тут.

Найкращий результат :plt.savefig('filename.pdf')

а потім перетворити цей pdf на png у командному рядку, щоб ви могли використовувати його в PowerPoint:

pdftoppm -png -r 300 filename.pdf filename

АБО просто відкривши PDF-файл та обрізавши потрібне зображення у Adobe, збереживши у форматі PNG та імпортуючи зображення у PowerPoint

Менш вдалий тест No1 :plt.savefig('filename.png', dpi=300)

Це дозволяє зберегти зображення з дещо вищою нормальною роздільною здатністю, але воно недостатньо для публікації чи деяких презентацій. Використання значення dpi до 2000 все ще дає розмиті зображення при перегляді зблизька.

Менш вдалий тест No2 :plt.savefig('filename.pdf')

Цю функцію неможливо відкрити в Microsoft Office Professional Plus 2016 (отже, немає PowerPoint), як і в Google Slides.

Менш успішний тест №3 :plt.savefig('filename.svg')

Її також не можна відкрити в Powerpoint або Google Slides із тією ж проблемою, що і вище.

Менш вдалий тест No4 :plt.savefig('filename.pdf')

а потім перетворити в png у командному рядку:

convert -density 300 filename.pdf filename.png

але це все ще занадто розмито, якщо дивитись зблизька.

Менш успішний тест №5 :plt.savefig('filename.pdf')

і відкриття в GIMP, і експорт у форматі png високої якості (розмір файлу збільшено з ~ 100 КБ до ~ 75 МБ)

Менш успішний тест №6 :plt.savefig('filename.pdf')

а потім перетворити в jpeg у командному рядку:

pdfimages -j filename.pdf filename

Це не призвело до помилок, але не призвело до результатів роботи Ubuntu навіть після зміни кількох параметрів.


1
.pdfбула найкращою якістю і для мене. Досить ідеальна якість, збільшена в цілому, так як 4k. Замість того, щоб конвертувати в командному рядку, мені досить зробити знімок екрана .pdf і зберегти його у png.
Девід Еріксон,

2

Для збереження графіка:

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

Для відображення графіку під час використання plt.show():

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

Просто додайте їх у верхній частині


0

В кінці циклу for () ви можете використовувати savefig()функцію замість plt.show () і встановити ім'я, dpi та формат фігури.

Наприклад, формат 1000 dpi та eps є цілком гарною якістю, і якщо ви хочете зберегти кожне зображення у папці ./ з іменами 'Sample1.eps', 'Sample2.eps' тощо, ви можете просто додати такий код:

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

    plt.savefig("./{}.eps".format(fname), bbox_inches='tight', format='eps', dpi=1000)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.