2017-06-01 4 views
1

Kontext:
Die Zeitschrift ich mein Papier einreichen möchten nur .tiff akzeptiert (nicht mit LaTeX arbeiten), .jpg (nicht geeignet für Graphen) und .eps (die doesn Ich arbeite nicht mit Alpha-Transparenz, außer wenn ich das Bild rastere, was zu riesigen Dateigrößen führt. Viele meiner Plots verwenden Seaborns regplot, die transparente Konfidenzintervalle auftragen. Ist es möglich, nicht-transparente CIs zu zeichnen, ohne alle meine Graphen manuell komplett neu zu erstellen (z. B. als gestrichelte Linien oder als Vollton im Hintergrund)?Undurchsichtige Konfidenzintervall in Seaborn

Beispiel:

import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 

sns.set_style("ticks") 
np.random.seed(0) 
n = 50 

fig, ax = plt.subplots(figsize=(8,6)) 

x = np.random.randn(n) 
y1 = np.random.randn(n) 
y2 = np.random.randn(n) 

sns.regplot(x, y1, ax=ax) 
sns.regplot(x, y2, ax=ax) 

plt.show() 

Example of a regplot with transparent overlapping confidence intervals

Was die einfachste/beste Weg wäre dies als Eps-Datei zu speichern, ohne Informationen aus dem überlappenden Konfidenzintervall zu verlieren?

Antwort

1

Das Problem besteht darin, dass Sie Transparenz benötigen, um die Überlappung der beiden Konfidenzintervalle anzuzeigen. Man müsste das Bild rastern.

Ich sehe nicht das Problem der Verwendung von jpg, wenn das Journal es akzeptiert. Sie können die Qualität des Bildes steuern

plt.savefig(__file__+".jpg", quality=95) 

Mit eps ist ebenfalls möglich, hier, statt alles von Rastern, können Sie nur das Konfidenzintervall fill_between -Kurven rastern. Der Vorteil besteht darin, dass die Achsen, Beschriftungen und Punkte immer noch Grafiken darstellen und auf verschiedenen Zoomstufen nicht pixelig aussehen.

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.collections import PolyCollection as p 
import seaborn as sns 

sns.set_style("ticks") 
np.random.seed(0) 
n = 50 

fig, ax = plt.subplots(figsize=(8,6)) 

x = np.random.randn(n) 
y1 = np.random.randn(n) 
y2 = np.random.randn(n) 

sns.regplot(x, y1, ax=ax) 
sns.regplot(x, y2, ax=ax) 

plt.savefig(__file__+".jpg", quality=95) 
for c in ax.findobj(p): 
    c.set_zorder(-1) 
    c.set_rasterized(True) 
#everything on zorder -1 or lower will be rasterized 
ax.set_rasterization_zorder(0) 

plt.savefig(__file__+".eps") 
plt.savefig(__file__+".png") 
plt.show() 

Die endgültige eps-Datei sieht wie folgt aus:
enter image description here

Während die Dateigröße natürlich ist ein bisschen größer, ich bin nicht sicher, ob dies ein echtes Problem.

+2

Niemals jpg für Plots verwenden !!! – mwaskom

+0

Oh, ich wusste nicht, dass Sie nur Teile des Bildes rastern können. Das ist ziemlich nett. Vielen Dank! Das Journal ist ziemlich streng in Bezug auf die Dateigröße, weshalb ich hauptsächlich nicht komprimierte JPGs verwenden wollte. Für die erste Eingabe habe ich einen Workaround verwendet, bei dem der "fill_between" -Teil im Seabor-Quellcode durch gestrichelte Linien ersetzt wurde, aber Ihre Lösung sieht viel eleganter aus. –

+1

PS warum vergleichen Sie die Zeichenfolge repr des Typs anstatt 'isinstance' zu ​​verwenden? Ich denke auch, dass Matplotlib-Achsen eine Funktion haben, die alle Künstler eines bestimmten Typs zurückgibt, aber ich vergesse, wie es heißt. – mwaskom

Verwandte Themen