Как исправить ошибки plt.show () и plt.savefig при увеличении DPI? - PullRequest
1 голос
/ 28 июня 2019

Я написал код, который требует ручного форматирования легенды, чтобы получить то, что я хочу. Основываясь на вопросе, который я вчера опубликовал , и еще на нескольких поисках, я получил легенду, чтобы выглядеть именно так, как я хочу, когда она отображается с использованием plt.show (). К сожалению, теперь, когда я сохраняю изображение, используя plt.savefig (dpi = 300), легенда полностью испорчена. Похоже, что когда я сохраняю его из окна plt.show, оно имеет разрешение 200 точек на дюйм, но я бы хотел сохранить его с разрешением не менее 300 или более точек на дюйм.

Какие графики, когда я использую plt.show это:

Но когда я сохраняю его в plt.savefig и меняю dpi на 300, это так:

Я вижу сообщения, как этот , в которых говорится, что между plt.show и plt.savefig существует разница в разрешении, но я не понимаю, как на самом деле решить эту проблему для меня. Я попытался установить размер фигуры, но как только я изменяю dpi в savefig, он снова облажается. Я также попытался добавить bbox_inches = 'sharp' в savefig, это не имеет значения.

Вот код для проверки:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerTuple

x = np.arange(3)
y = np.arange(3)

c1= plt.plot(x,y, color = 'blue'    , label= "blue")
c2 = plt.plot(x,y, color = 'green'   , label= "green")
c3 = plt.plot(x,y, color = 'red'     , label= "red")
c4 = plt.plot(x,y, color = 'magenta' , label= "magenta")



p1 = plt.scatter(x,y, color = 'blue')
p2 = plt.scatter(x,y, color = 'green')
p3 = plt.scatter(x,y, color = 'red')
p4 = plt.scatter(x,y, color = 'magenta')

t1 = plt.scatter(x,y, color = 'blue',  facecolors='none')
t2 = plt.scatter(x,y, color = 'green',  facecolors='none')
t3 = plt.scatter(x,y, color = 'red',  facecolors='none')
t4 = plt.scatter(x,y, color = 'magenta',  facecolors='none')

l1 = plt.legend(handlelength = 0, bbox_to_anchor=(1, .5, 0,0), loc ='center right')  
llines = l1.get_texts()
llines[0].set_color('blue')
llines[1].set_color('green')
llines[2].set_color('red')
llines[3].set_color('magenta')

shift = max([t.get_window_extent().width for t in l1.get_texts()]) 
for t in l1.get_texts():
    t.set_ha('right') 
    t.set_position((shift,0))

l2 = plt.legend([(p1, p2, p3, p4), (t1, t2, t3, t4)], ['tomatoes', 'potatoes'],
       scatterpoints=1, numpoints=1, loc = 'center right',bbox_to_anchor=(1, .3, 0,0),  
       handler_map={tuple: HandlerTuple(ndivide=None)})

plt.gca().add_artist(l1)

shift2 = max([t2.get_window_extent().width for t2 in l2.get_texts()])  
for t2 in l2.get_texts():
    t2.set_ha('right') # ha is alias for horizontalalignment
    t2.set_position((shift2,0))   


plt.show()
filename_save = "testfile"
plt.savefig(filename_save, dpi = 300, bbox_inches='tight')

Есть идеи? Спасибо за вашу помощь!

...