diff --git a/analyse_korrelation.py b/analyse_korrelation.py index 9f0c6b9..93c861e 100644 --- a/analyse_korrelation.py +++ b/analyse_korrelation.py @@ -491,11 +491,6 @@ df['X_Dimension'] = df[[tag for tag in tags_to_search_processed if tag in df.col df['Y_Dimension'] = df[[cat for cat in categories_processed if cat in df.columns]].sum(axis=1) df['Z_Dimension'] = df[[rq for rq in research_questions_processed if rq in df.columns]].sum(axis=1) -# Clusteranalyse mit K-Means basierend auf den deduktiven Dimensionen -features = df[['X_Dimension', 'Y_Dimension', 'Z_Dimension']] -scaler = StandardScaler() -scaled_features = scaler.fit_transform(features) - # Clusteranalyse mit K-Means basierend auf den deduktiven Dimensionen # Prüfung auf konstante deduktive Dimensionen if df[['X_Dimension', 'Y_Dimension', 'Z_Dimension']].nunique().eq(1).all(): @@ -568,6 +563,19 @@ for cluster in cluster_means.index: # Statische Cluster-Beschriftungen in den DataFrame einfügen df['Cluster_Label'] = df['KMeans_Cluster'].map(cluster_labels) +df['Cluster_Label'] = df['Cluster_Label'].fillna(df['KMeans_Cluster']) + +# Farbzuordnung für die Clusterlabels aus den CI-Farben ableiten +fallback_color = cluster_colors.get("0", colors.get('primaryLine', '#1f77b4')) +color_map = {} +for cluster_key, label in cluster_labels.items(): + base_color = cluster_colors.get(str(cluster_key), fallback_color) + color_map[label] = base_color + +# Sicherstellen, dass auch eventuelle Restlabels (z.B. "Nicht gültig") erfasst werden +for label in df['Cluster_Label'].dropna().unique(): + if label not in color_map: + color_map[label] = cluster_colors.get(str(label), fallback_color) # Ausgabe der statischen Cluster-Beschriftungen print("Cluster-Beschriftungen (inhaltlich):") @@ -584,7 +592,7 @@ fig_cluster = px.scatter_3d( color='Cluster_Label', size='Point_Size', size_max=100, - color_discrete_sequence=list(cluster_colors.values()), + color_discrete_map=color_map, hover_data={ 'Cluster_Label': True, 'X_Dimension': True, @@ -753,8 +761,17 @@ def plot_average_correlation_plotly(summary_df): ) # PNG-Export ergänzen png_path = os.path.join(export_path_png, f"{slugify('summary_plot_' + global_bib_filename.replace('.bib', ''))}.png") - fig.write_image(png_path, width=1200, height=800, scale=2) - print(f"✅ PNG-Summary-Datei gespeichert unter: {png_path}") + try: + fig.write_image(png_path, width=1200, height=800, scale=2) + print(f"✅ PNG-Summary-Datei gespeichert unter: {png_path}") + except ValueError as err: + if "kaleido" in str(err).lower(): + print("⚠️ PNG-Export übersprungen: Plotly benötigt das Paket 'kaleido'.") + print(" Installation (falls gewünscht): pip install -U kaleido") + else: + print(f"⚠️ PNG-Export fehlgeschlagen: {err}") + except Exception as err: + print(f"⚠️ PNG-Export fehlgeschlagen: {err}") #============================ # Aufruf Alle möglichen bivariaten Korrelationen visualisieren @@ -773,4 +790,4 @@ plot_average_correlation_plotly(summary_df) # Visualisierungsoption für Plotly: Immer im Browser öffnen import plotly.io as pio -pio.renderers.default = 'browser' \ No newline at end of file +pio.renderers.default = 'browser' diff --git a/analyse_netzwerk.py b/analyse_netzwerk.py index 8817e9f..0f24db9 100644 --- a/analyse_netzwerk.py +++ b/analyse_netzwerk.py @@ -166,13 +166,6 @@ def visualize_network(bib_database): if tag in keyword: tag_counts[tag] += 1 - fundzahlen = defaultdict(int) - for tag, count in tag_counts.items(): - search_term = tag.split(':')[-1] - for key, value in search_terms.items(): - if search_term == value: - fundzahlen[value] += count - search_terms_network = { "Primäre Begriffe": { "learning:management:system": [ @@ -181,7 +174,7 @@ def visualize_network(bib_database): "online:lernplattform", "online:lernumgebung", "digital:learning", - "digitales:lernen" + "digital:lernen" ] }, "Sekundäre Begriffe": { @@ -191,15 +184,15 @@ def visualize_network(bib_database): ], "bildung:technologie": [ "digital:learning", - "digitales:lernen", + "digital:lernen", "blended:learning" ], "digital:learning": [ - "digitale:medien", + "digital:medien", "online:learning" ], - "digitales:lernen": [ - "digitale:medien", + "digital:lernen": [ + "digital:medien", "online:lernen" ], "blended:learning": ["mooc"] @@ -210,6 +203,14 @@ def visualize_network(bib_database): } } + # Fundzählung exakt entlang der search_terms-Definition + fundzahlen = defaultdict(int) + + for number, suchbegriff in search_terms.items(): + for typ in types: + tag = f'#{number}:{typ}:{suchbegriff}'.lower() + fundzahlen[suchbegriff.lower()] += tag_counts.get(tag, 0) + G = nx.Graph() hierarchy_colors = {