it-swarm.com.de

Wie kann man Matplotlib-Graphen so professionell aussehen lassen?

Standard-Matplotlib-Diagramme sehen sehr unattraktiv und sogar unprofessionell aus. Ich habe ein paar Pakete ausprobiert, die sowohl seaborn als auch prettyplotlib enthalten, aber beide verbessern den Stil kaum.

Bisher habe ich mit seaborn-Paket folgende bekommen:

enter image description here

Unten ist das Aussehen, nach dem ich suche, weit entfernt von oben:

enter image description here

Beachten Sie im 2. Beispiel die folgende Freundlichkeit:

  1. Der Bereich unter dem Diagramm ist mit einer viel schöneren Farbe ausgefüllt.
  2. Die Grafiklinie ist ein Denker und fällt gut auf.
  3. Achsenlinien sind Denker und heben sich wieder schön hervor.
  4. Der Bereich unter der Kurve ist transparent.
  5. Die Häkchen in der X-Achse sind dichter.

Meine Fragen sind: Erkennen Sie oben ein beliebtes Thema oder einen beliebten Stil, den ich schnell in matplotlib verwenden kann? Oder ob ich aus irgendeinem Paket nutzen kann? Wenn dies nicht der Fall ist, kann ich diesen Stil trotzdem als meine globale Präferenz festlegen? Ist es sonst überhaupt möglich, dies in matlibplot zu tun?

Vielen Dank!

12
Shital Shah

Das ist wirklich Geschmackssache und auch eine Zielgruppe. matplotlib versucht klare Illustrationen für wissenschaftliche Zwecke zu erstellen. Dies ist notwendigerweise ein Kompromiss, und die Illustrationen sind nichts, was Sie in einer Zeitschrift drucken oder in einer Anzeige zeigen würden.

Es gibt einige gute und schlechte Nachrichten über matplotlib in diesem Sinne.

Schlechte Nachrichten:  

  • Es gibt keinen einzelnen magischen Befehl oder Paket, das mit matplotlib schöne Diagramme erzeugen würde. 

Gute Nachrichten:

  • Es gibt einfache Möglichkeiten, die Standardeinstellungen zu ändern. Siehe: http://matplotlib.org/users/customizing.html
  • Das Objektmodell ermöglicht dem Benutzer, fast alles zu ändern und komplexe neue Funktionen einzuführen.
  • Der Quellcode ist verfügbar und kann auch vom Benutzer leicht geändert werden.

Meiner Meinung nach ist es am schwierigsten zu entscheiden, was Sie wollen. Dann ist es einfacher, das zu tun, was Sie wollen, auch wenn es am Anfang eine steile Lernkurve gibt.

Nur als Beispiel:

import numpy as np
import matplotlib.pyplot as plt


# create some fictive access data by hour
xdata = np.arange(25)
ydata = np.random.randint(10, 20, 25)
ydata[24] = ydata[0]

# let us make a simple graph
fig = plt.figure(figsize=[7,5])
ax = plt.subplot(111)
l = ax.fill_between(xdata, ydata)

# set the basic properties
ax.set_xlabel('Time of posting (US EST)')
ax.set_ylabel('Percentage of Frontpaged Submissions')
ax.set_title('Likelihood of Reaching the Frontpage')

# set the limits
ax.set_xlim(0, 24)
ax.set_ylim(6, 24)

# set the grid on
ax.grid('on')

(Nur ein Kommentar: Die Grenzen der X-Achse im Originalbild berücksichtigen nicht die Zyklizität der Daten.)

Das gibt uns so etwas:

enter image description here

Es ist leicht zu verstehen, dass wir viele Änderungen vornehmen müssen, um dies einem weniger technikaffinen Publikum zeigen zu können. Wenigstens:

  • machen die Füllung transparent und weniger anstößig in Farbe
  • mach die Linie dicker
  • Ändern Sie die Linienfarbe
  • fügen Sie der X-Achse weitere Ticks hinzu
  • Ändern Sie die Schriftarten der Titel

# change the fill into a blueish color with opacity .3
l.set_facecolors([[.5,.5,.8,.3]])

# change the Edge color (bluish and transparentish) and thickness
l.set_edgecolors([[0, 0, .5, .3]])
l.set_linewidths([3])

# add more ticks
ax.set_xticks(np.arange(25))
# remove tick marks
ax.xaxis.set_tick_params(size=0)
ax.yaxis.set_tick_params(size=0)

# change the color of the top and right spines to opaque gray
ax.spines['right'].set_color((.8,.8,.8))
ax.spines['top'].set_color((.8,.8,.8))

# Tweak the axis labels
xlab = ax.xaxis.get_label()
ylab = ax.yaxis.get_label()

xlab.set_style('italic')
xlab.set_size(10)
ylab.set_style('italic')
ylab.set_size(10)

# Tweak the title
ttl = ax.title
ttl.set_weight('bold')

Jetzt haben wir:

enter image description here

Dies ist nicht genau wie in der Frage, aber alles kann in diese Richtung eingestellt werden. Viele der hier festgelegten Einstellungen können als Standard für matplotlib festgelegt werden. Vielleicht gibt dies eine Vorstellung davon, wie man Dinge in den Handlungen ändern kann.

16
DrV

Um dem von Ihnen bevorzugten Stil näher zu kommen, können Sie den Stil whitegrid in Seaborn verwenden. Wie die anderen Antworten bereits festgestellt haben, steuern Sie die Transparenz der Füllung mit dem Parameter alpha zu fill_between.

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style("whitegrid")

blue, = sns.color_palette("muted", 1)

x = np.arange(23)
y = np.random.randint(8, 20, 23)

fig, ax = plt.subplots()
ax.plot(x, y, color=blue, lw=3)
ax.fill_between(x, 0, y, alpha=.3)
ax.set(xlim=(0, len(x) - 1), ylim=(0, None), xticks=x)

enter image description here

Weitere Informationen zu Seaborn-Styles finden Sie in docs .

6
mwaskom

matplotlib ist fast unendlich flexibel, so dass Sie fast alles damit machen können. Wenn es nicht existiert, können Sie es selbst schreiben! Natürlich sind die Standardwerte fad, denn jeder hat eine eigene Vorstellung von "Nizza". Daher ist es sinnlos, einen vordefinierten Stil festzulegen.

Hier ist ein wirklich einfaches Beispiel, das 4 Ihrer Punkte anspricht. 

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

x = np.linspace(-10, 10, 1000)
y = 1+np.sinc(x)

ax = plt.subplot(111)
ax.plot(x, y, lw=2)
ax.fill_between(x, 0, y, alpha=0.2)
ax.grid()

majorLocator   = MultipleLocator(1)
ax.xaxis.set_major_locator(majorLocator)

plt.show()

enter image description here

Wenn Sie die Standardwerte so einstellen möchten, dass alle Ihre Darstellungen gleich aussehen, sollten Sie einen benutzerdefinierten matplotlibrc file generieren. Eine nützliche Anleitung ist hier . Um eine Liste aller verfügbaren Optionen anzuzeigen, rufen Sie print plt.rcParams von einem interaktiven Terminal aus auf. 

Einige der anderen Funktionen wie das Füllen müssen auf Plot-Basis erfolgen. Sie können dies für Ihre gesamte Arbeit vereinheitlichen, indem Sie eine Funktion erstellen, die die Füllung zwischen bestimmten Eingaben wie Achsinstanz und Daten hinzufügt. 

2
Greg

Sie können den Plotstil wie folgt anpassen:

import numpy as np
import matplotlib.pyplot as plt
plt.use_style('ggplot') # customize your plots style
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
plt.fill_between(x,y)
plt.show()
1
afternone