Datenpunkte aus Dataframe mit unterschiedlichen Farben und Punktgrößen plotten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
NinoBaumann
User
Beiträge: 77
Registriert: Samstag 25. April 2020, 19:03

Hallo,

ich habe ein Dataframe mit zehn Spalten. Von diesen Spalten möchte ich zwei in einem Punktidagramm plotten. Dabei sollen die neusten, also obersten 50 Werte, mit einem größeren Punkt geplottet werden als die Restlichen. Zudem sollen alle grün markiert werden, außer diejenigen Datenpunkte, welche sich außerhalb gewisser XY-Grenzen bewegen. Diese sollen rot markiert werden. Klar könnte ich jetzt aus dem Dataframe vier "Einzelne" machen. Also:
-Tabelle 1: letzte 50 Teile okay (i.O.) -> Datenpunkte groß + Farbe grün
-Tabelle 2: letzte 50 Teile nicht okay (n.i.O.) -> Datenpunkte groß + Farbe rot
-Tabelle 3: alle Teile außer die ersten 50 Stk. okay (i.O.) -> Datenpunkte klein + Farbe grün
-Tabelle 4: alle Teile außer die ersten 50 Stk. nicht okay (n.i.O.) -> Datenpunkte klein + Farbe rot
und dann alle einzeln mit scatter Plotten. So habe ich es jetzt gemacht. Aber ich wollte mal abklären weil ich dazu nichts im Netz gefunden habe, ob es noch eine andere, evtl. bessere, Lösung gibt. Wäre dankbar über Eure Erfahrungen dazu.
Danke!
Sirius3
User
Beiträge: 18034
Registriert: Sonntag 21. Oktober 2012, 17:20

Erster Anlaufpunkt wäre, in die Dokumentation (https://pandas.pydata.org/docs/referenc ... atter.html) zu schauen, vor allem, was da zu Size und Color steht.
NinoBaumann
User
Beiträge: 77
Registriert: Samstag 25. April 2020, 19:03

Ich habe es wie folgt gelöst:

Code: Alles auswählen

self.a_scatter_colors = ['red' if x==1 or y==1 else 'green' for x,y in zip(self.df_Data_GM['BM_niO'], self.df_Data_GM['AS_niO'])]
self.a_scatter_sizes = [15 if i <= self.n_latest_X_values-1 else 1 for i in range(len(self.df_Data_GM))]
self.a_scatter_edgecolors = ['black' if i <= self.n_latest_X_values-1 else 'none' for i in range(len(self.df_Data_GM))]

self.fig1, self.ax = plt.subplots(figsize=(7.5, 6.5))
self.ax.scatter(list(self.df_Data_GM['Beugemoment']), list(self.df_Data_GM['Axialspiel']), color=self.a_scatter_colors, s=self.a_scatter_sizes, edgecolor=self.a_scatter_edgecolors)
self.ax.set_xlabel('Beugemoment [Nm]', fontsize=12)
self.ax.set_ylabel('Axialspiel [mm]', fontsize=12)
self.ax.grid()
 
self.canvas = FigureCanvasTkAgg(self.fig1, master = self.frame_chart)
self.canvas.draw()
self.canvas.get_tk_widget().grid(row=0, column=0)
Sirius3
User
Beiträge: 18034
Registriert: Sonntag 21. Oktober 2012, 17:20

@NinoBaumann: ein guter Einstieg ist es, das Pandas-Tutorial durchzuarbeiten. Dort lernt man die wichtigsten Funktionen von Pandas kennen.
Es macht meist keinen Sinn, alles an self zu binden. ax, colors, sizes und edgecolors sind nur für das Plotten relevant und kaum in anderen Bereichen Deines Programms.
Bei fig1 scheint die 1 willkürlich.

Code: Alles auswählen

bm_or_as = (self.df_Data_GM['BM_niO'] == 1) | (self.df_Data_GM['AS_niO'] == 1)
first_datasets = (bm_or_as.index.to_series() < self.n_latest_X_values)
colors = bm_or_as.map({False: "red", True: "green"})
sizes = first_datasets.map({True: 15, False: 1})
edge_colors = first_datasets.map({True: 'black', False: 'none'})

figure, axis = plt.subplots(figsize=(7.5, 6.5))
self.df_Data_GM.plot.scatter(
    'Beugemoment', 'Axialspiel',
    ax=axis
    c=colors,
    s=sizes,
    edgecolor=edge_colors
    xlabel='Beugemoment [Nm]',
    ylabel='Axialspiel [mm]',
    fontsize=12,
    grid=True
)
 
self.canvas = FigureCanvasTkAgg(figure, master=self.frame_chart)
self.canvas.draw()
self.canvas.get_tk_widget().grid(row=0, column=0)
Antworten