Ho una matrice di medie dimensioni (ad esempio 1500x3000) che voglio tracciare in scala poiché è un'immagine. Tuttavia, le scale verticale e orizzontale sono molto diverse. Per semplificare diciamo che c'è un metro/riga e 10/colonna. La trama dovrebbe quindi produrre un'immagine che è c. 1500x30000. Io uso l'estensione kwarg per le scale e aspect = 1 per evitare la deformazione. O utilizzando le finestre di stampa (QT4) e imshow() o usando savefig(), non sono mai riuscito a produrre l'immagine in scala e alla massima risoluzione.Tracciare a piena risoluzione con matplotlib.pyplot, imshow() e savefig()?
ho guardato a molte soluzioni proposte come indicato nella here, here o here e there o there nel caso in cui si trattava di un bug. Ho modificato il mio matplotlibrc e l'ho messo in ~/.config/matplotlib per provare a forzare le opzioni my display/savefig ma senza risultato. Ho anche provato con pcolormesh() ma senza successo. Io uso python 2.7 e matplotlib 1.3 dal repository di Ubuntu 14.04 e QT4Agg come back-end. Ho provato anche TkAgg, ma è lento e dà gli stessi risultati. Ho l'impressione che nell'asse delle x la risoluzione sia corretta, ma è decisamente sottocampionata nella direzione verticale. Ecco un pezzo di codice che dovrebbe simulare il mio problema.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
R, C = 1500, 3000
DATA = np.random.random((R, C))
DATA[::2, :] *= -1 # make every other line negative
Yi, Xi = 1, 10 # increment
CMP = 'seismic'
ImageFormat ='pdf'
Name = 'Image'
DataRange = (np.absolute(DATA)).max() # I want my data centred on 0
EXTENT = [0, Xi*C, 0 ,Yi*R]
NORM = matplotlib.colors.Normalize(vmin =-DataRange, vmax= DataRange, clip =True)
for i in range(1,4):
Fig=plt.figure(figsize=(45, 10), dpi = 100*i, tight_layout=True)
Fig.suptitle(Name+str(i)+'00DPI')
ax = Fig.add_subplot(1, 1, 1)
Plot = ax.imshow(DATA, cmap=plt.get_cmap(CMP), norm = NORM, extent = EXTENT, aspect = 1, interpolation='none')
ax.set_xlabel('metres')
ax.set_ylabel('metres')
Fig.savefig(Name+str(i)+'00DPI.'+ImageFormat, format = ImageFormat, dpi = Fig.dpi)
plt.close()
In imshow(), interpolazione = 'none' o 'più vicino' o 'bilineare' non cambia la risoluzione per qualche ragione anche se penso che si suppone almeno nella finestra di Qt4 se faccio spettacolo() invece di savefig(). Si noti che la risoluzione è la stessa nelle figure salvate qualunque cosa si è impostata in plt.figure (dpi =).
Sono fuori di idea e al limite delle mie conoscenze su come funzionano le cose con questo sistema. Qualsiasi aiuto è molto gradito.
Grazie in anticipo.
Il salvataggio come SVG è un'opzione? 'plt.savefig (" test.svg ")' – Eric
Non ho notato un miglioramento del salvataggio come svg in termini di risoluzione verticale. – Boorhin
Ho modificato il codice in modo che l'immagine alternerà i valori positivi e negativi verticalmente. L'idea principale è che se le immagini vengono risolte per intero dovremmo essere in grado di distinguere le strisce orizzontali blu e rosse – Boorhin