2015-09-27 3 views
1

Я написал код для создания многослойной фигуры в matplotlib. Чтобы сделать рисунок более четким для использования в документе, я попытался увеличить dpi. Я нашел, однако, что это также изменили размеры фигуры, шрифт, линий и т.д., как показано на следующем простом примере:Регулировка качества фигуры в matplotlib

#First normal figure 
fig, axarr = plt.subplots(2,2, figsize=(6,6)) 
for i,ax in enumerate(axarr.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 
plt.tight_layout() 

#Again, with higher dpi 
fig, axarr = plt.subplots(2,2, figsize=(6,6), dpi=200) 
for i,ax in enumerate(axarr.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 

plt.tight_layout() 
plt.show() 

На моем компьютере (с помощью Matplotlib 1.4.3), вторая цифра больше по размеру, а текст больше, так что метки оси Y перекрываются. Без использования plt.tight_layout() совпадение осей подзаголовка также хуже. Очевидно, что это не полезно, когда вы пытаетесь сделать более качественную цифру. Что здесь происходит, и как я могу изменить качество фигуры и сохранить внешний вид фигуры? Есть ли решение, которое также будет работать, когда я настроил параметры подзадачи, добавил цветовые полосы и легенды и т. Д., Т. Е. Вообще? Заранее благодарим за любую помощь, которую вы можете дать.

ответ

2

Ваша проблема заключается в том, что вы показываете его, а затем сохраняете его в окне графического интерфейса. Вы должны сохранить изображение из команды savefig, определяя там dpi.

Что-то вроде этого:

import matplotlib.pyplot as plt 

#First normal figure 
fig, axarr = plt.subplots(2,2, figsize=(6,6)) 
for i,ax in enumerate(axarr.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 
plt.tight_layout() 
plt.savefig('myfigure_100.png', dpi=100) 
plt.savefig('myfigure_200.png', dpi=200) 

Если вы хотите, чтобы показать это, вы можете в конце scrpit добавить plt.show()

EDIT

Отношение точек на дюйм рисунка размер и размер шрифта могут быть показаны в следующем примере:

import matplotlib.pyplot as plt 

#First normal figure 
fig1, axarr1 = plt.subplots(2,2, figsize=(6,6), dpi=100) 
for i,ax in enumerate(axarr1.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 
plt.tight_layout() 

fig2, axarr2 = plt.subplots(2,2, figsize=(12,12), dpi=50) 
for i,ax in enumerate(axarr2.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=20) 
    ax.set_xlabel('x'+str(i), fontsize=20) 
    ax.set_ylabel('y'+str(i), fontsize=20) 
plt.tight_layout() 

plt.show() 
+0

Спасибо за это. Я хотел бы упомянуть, что, если это возможно, я бы предпочел не делать это с помощью savefig, поскольку я использую тот же скрипт с разными аргументами для создания большого количества цифр, и мне нужно будет вызвать savefig для каждого из них вне сценария (поскольку имена файлов, которые я использую, нелегко «программируемы»), и я нахожу, что могу легко ошибиться, например, сохранить неправильную цифру в файл, если я это сделаю. Если я буду делать что-то подобное в будущем, я мог бы также забыть о настройке dpi. Нет ли способа сделать это без использования savefig? – PeterW

+0

Мне также было бы очень интересно понять, почему изменение dpi влияет на внешний вид графика в окне графического интерфейса пользователя, если это кому-то известно. – PeterW

+1

Если ваши имена нелегко программируются, создайте список и передайте соответствующий аргумент в качестве имени сохраненного изображения. Что касается второго комментария, я отредактировал свой комментарий, чтобы объяснить, почему изменение dpi может быть одинаковым. dpi означает «точка на дюйм», а шрифты - это размер точек цифр/букв. Поэтому, в зависимости от того, как вы их выбираете, результат может быть одинаковым. – iblasi