Antwort mit KI erzeugt
Visualisierung der Verteilungen von zwei Variablen:
Die Visualisierung der Verteilungen von zwei Variablen kann durch verschiedene Ansätze erfolgen, unter denen Box-Plots und Verteilungsfunktionen gängige Optionen sind. Für einen bildhaften und vergleichenden Überblick eignen sich besonders Scatterplots und Dichtefunktionen (wie KDE-Plots), die in deinem Fall verwendet werden.
Vor dem Zeichnen der Verteilungen ist es wichtig, den Zweck und das Publikum der Visualisierung zu berücksichtigen. Die Wahl der Visualisierungsart hängt davon ab, welche Aspekte der Daten (wie zentrale Tendenz, Streuung, Outliers, Beziehung zwischen den Variablen usw.) betont werden sollen.
Dein Ansatz, die mittleren Werte für bestimmte Gruppen (z.B. politische Parteien) mittels Scatterplots darzustellen und dann mittels eines KDE-Plots die Gesamtverteilung der Daten zu visualisieren, ist zweckmäßig. Allerdings scheint dein Skript auf ein Problem gestoßen zu sein. Lass uns auf die möglichen Probleme und deren Lösungen eingehen:
1.
Problem bei Figure und Axes-Erstellung: Du erstellst eine
plt.subplots()
Instanz bereits nachdem du mittels
plt.scatter()
und anderen
plt
-Funktionen gezeichnet hast. Dies kann dazu führen, dass deine vorherigen Plots nicht in deinem subplot erscheinen, da
plt.subplots()
eine neue Figur initialisiert.
Lösung: Initialisiere deine Figure und Axes zu Beginn deiner Funktion, um sicherzustellen, dass all deine Plots auf derselben Figure/Axes gezeichnet werden.
2.
Doppelte Verwendung von plt und sns auf unterschiedlichen Axes: Wenn du sowohl Matplotlib (plt) als auch Seaborn (sns) verwendest, musst du konsistent bei der Angabe der Axes sein, auf denen die Darstellung stattfinden soll.
Hier ist eine angepasste Version deiner Funktion, die diese Probleme adressiert:
python
import matplotlib.pyplot as plt
import seaborn as sns
def plot_mean(columns_x, columns_y, df_parties_means, df_features):
try:
f, ax = plt.subplots(figsize=(6, 6))
plt.axis([-1, 1, -1, 1])
plt.grid(True)
plt.xlabel(columns_x)
plt.ylabel(columns_y)
# We get all parties from df_parties_means
for party in df_parties_means['Party']:
# we get the probability distribution function
party_x = df_parties_means.loc[
((df_parties_means['Question'] == columns_x) & (df_parties_means['Party'] == party)), 'Mean']
party_y = df_parties_means.loc[
((df_parties_means['Question'] == columns_y) & (df_parties_means['Party'] == party)), 'Mean']
# we plot the party related to the questions
ax.scatter(party_x.values[0], party_y.values[0],
alpha=0.4, edgecolors='w', label = party)
ax.text(party_x.values[0], party_y.values[0], party, fontsize=10)
# We plot the people preferences
ax.scatter(df_features[columns_x].mean(skipna=True), df_features[columns_y].mean(skipna=True),
alpha=0.4, edgecolors='w')
# plot the density function for the people preferences
sns.kdeplot(df_features[columns_x], df_features[columns_y], ax=ax)
sns.rugplot(df_features[columns_x], color="g", ax=ax)
sns.rugplot(df_features[columns_y], vertical=True, ax=ax)
plt.title('Perceptual map', y=1.05)
plt.show()
except Exception as e:
print(len(party_x))
print(len(party_y))
print("columns_x: ", columns_x)
print("columns_y: ", columns_y)
Stelle sicher, dass
df_parties_means
und
df_features
die entsprechenden Datenframes sind, die du verwenden möchtest. Deine Funktion sollte nun korrekt funktionieren und eine kombinierte Darstellung der individuellen Punkte (für jede Partei) und der Gesamtverteilung (mittels KDE) erzeugen.