Ich habe ein Problem: Bei diesem Beispiel sind die Werte auf der X-Achse Jahre. Sie sollten als ganze Zahlen und nicht beispielsweise "2007.5" dargestellt werden. Wie kann ich das erreichen?
Leider bin ich nicht früher dazu gekommen, dies zu schreiben, weil in dem realen Programm noch so allerlei andere Dinge passieren, die ich auch noch anpassen muss.
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import YearLocator
X = []
for year in range(1991, 2011+1):
if year == 2000: # Ein Jahr Lücke
continue
X.append(datetime(day=1, month=1, year=year))
Y = [1] * len(X)
locator = YearLocator(1)
locator.set_axis(plt.axis)
print(f"len Y: {len(Y)}")
print(f"len X: {len(X)}")
plt.violinplot(Y, positions=X)
plt.show()
Es wird mir eine seltsame Fehlermeldung ausgegeben, die ich leider nicht weg bekomme.
Wie kann ich ein violin plot erzeugen?
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import YearLocator
import numpy as np
X_years = range(1991, 2011 + 1)
X = [datetime(day=1, month=1, year=year) for year in X_years]
Y = [1] * len(X)
data = [X_years, Y] # Auch mit numplot experimentiert
# locator = YearLocator(1)
# locator.set_axis(plt.axis)
print(f"len X: {len(X)}, len Y: {len(Y)}, len X_years: {len(X_years)}")
plt.violinplot(data) # , positions=X_years)
plt.show()
import random
import matplotlib.pyplot as plt
import numpy as np
figure,ax = plt.subplots()
begin = 1991
end = 2011
Jahre = []
data = []
for year in range(begin, end+1):
if year == 2000:
continue
Jahre.append(year)
data.append(random.sample(range(10, 30), 10))
ax.set_xticks(np.arange(len(Jahre)))
ax.set_xticklabels(Jahre)
plt.violinplot(data)#, positions=Jahre)
plt.gcf().autofmt_xdate()
plt.show()
Wenn ich das mit den positions wegkommentiert lasse, werden die Jahreszahlen zwar ausgegeben (aber für meinen Geschmack zu viele), aber an der verkehrten Position. Und wenn ich es mit positions mache, werden gar keine ausgegeben. Es ist zum Mäuse melken!
Jein. Die einzelnen Spalten tragen zwar nun die korrekte Beschriftung, die treten aber lückenlos auf: In diesem Beispiel ..., 1998, 1999, 2001, 2002, ... Das Jahr 2000 wird buchstäblich spurlos ausgelassen.
Im matplotlib-Handbuch steht unter matplotlib.axes.Axes.violinplot: positions: array-like, default: [1, 2, ..., n]
Sets the positions of the violins. The ticks and limits are automatically set to match the positions.
Bei Verwendung von Positions dürfen daher keine ticks gesetzt werden.
import random
import matplotlib.pyplot as plt
import numpy as np
figure,ax = plt.subplots()
begin = 1991
end = 2011
Jahre = []
data = []
for year in range(begin, end+1):
if year == 2000:
continue
Jahre.append(year)
data.append(random.sample(range(10, 30), 10))
plt.violinplot(data, positions=Jahre)
plt.gcf().autofmt_xdate()
plt.show()
Das Problem tritt immer noch auf. Ich habe nochmal genauer nachgeschaut, und die Jahre beginnen bei 1992. Hier also ein Minimalbeispiel, bei dem der Fehler trotz aller Bemühungen immer noch auftritt:
import random
from matplotlib import pyplot as plt
keys = []
values = []
for year in range(1992, 2011+1):
if year == 1994:
continue
keys.append(year)
values.append(random.sample(range(10, 30), 3))
print(f"keys: {keys}; type: {type(keys[5])}")
print(f"values: {values}")
#plt.gcf().autofmt_xdate()
plt.violinplot(values, positions=keys)
plt.show()
Ob die Zeile mit xdate auskommentiert ist oder nicht macht übrigens keinen einschneidenden Unterschied.
Gut noch einmal kurz zusammengefasst:
Mit "set_xticks/set_yticks" definiert man die Anzahl der Ticks (also die Anzahl der Einteilungsstriche) auf den Achsen eines Diagramms.
Die Beschriftung der Achsen macht man mit: "set_xtickslabels/set_ytickslabels" und da kann man alles mögliche
eintragen, Werte, Strings, Daten, Uhrzeiten u.s.w. Es ist also problemlos möglich auf den Achsen des Diagramms
3 Einteilungstriche und 15 Beschriftungen festzulegen...oder umgekehrt.
Beides kann man völlig frei festlegen und hat zunächst einmal nichts mit der Anzahl der Violinenplots zu tun.
Die gewünschte Größe eines Diagramms legt man üblicherweise mit: "figsize=(Breite,Höhe)" fest.
Beispiel:
fig, ax = pyplot.subplots(nrows=2, ncols=3, dpi=100, figsize=(16,8))
Zu den Violinenplots.Die haben kein X/Y, wie ein LinienPlot
Die Daten stammen(in dem Code-Snippet) aus einem simulierten Dataset mit 3 Datensätzen (kann auch eine Datenbank, oder CSV o.ä sein),
und nur die Anzahl der Datensätze bestimmt (in dem Code-Snippet) wie vieviele Violinen angezeigt werden
d.h.
wenn du eine z.B eine CSV-Datei mit 10 Datensätzen einliest,und in einer Liste(hier: data) zusammenfasst(wie im Code-Snippet gezeigt) werde eben auch 10 Violinenplots
angezeigt.Wenn du nur jeden zweiten Datensatz haben möchtest,trägst du in die Liste eben nur jede zweiten Datensatz ein u.s.w.. Wenn man das so macht, braucht man
den Positions-Parameter gar nicht. Du kannst es aber auch anders regeln...ganz nach deinen eigenen Vorstellungen.
Hoffe das hat geholfen Unklarheiten zu beseitigen.
Hallo,
wollte jetzt keinen neuen Thema öffnen.
Ich habe ein Problem, ich will einen aus einem Bild mit einer Auflösung von 2592*1944 Pixeln die schwarzen Pixeln in einen Histogramm darstellen. Es soll ein Histogramm erstellt werden, der ungefärht anzeigt, wo sich die schwarzen Pixeln häufen.
Ich weiß aber leider nicht, wie ich vorgehen soll, bin leider aber auch nicht fündig geworden.
Kann mir jemand weiterhelfen.