0 Daumen
269 Aufrufe

Ich möchte die Verteilungen von zwei Variablen beschreiben. Ich dachte, dass ich entweder Box-Plots verwenden würde, die sowohl die x-Achse als auch die y-Achse überspannen, oder Verteilungsfunktionen.

bivariate_pca.png

Aber es is ein bivariate PCA Oder:

distributions_34_0.png



Also tat ich es:

def plot_mean(columns_x, columns_y):
  try:
      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
              plt.scatter(party_x.values[0], party_y.values[0],
                      alpha=0.4, edgecolors='w',label = party)
              plt.text(party_x.values[0], party_y.values[0], party, fontsize=10)
      # We plot the people preferences
      plt.scatter(df_features[columns_x].mean( skipna = True), df_features[columns_y].mean( skipna = True),
          alpha=0.4, edgecolors='w')
      f, ax = plt.subplots(figsize=(6, 6))
     
      # 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)
     
import itertools
 
pairs = list(itertools.combinations(df_features.columns, 2))

[plot_mean(pair[0],pair[1]) for pair in pairs]


Aber ich erhielt:

perceptual_map.jpg

distribution.jpg




Avatar von

1 Antwort

0 Daumen

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.
Avatar von 4,6 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community