Compare commits

...

2 Commits

2 changed files with 39 additions and 22 deletions

View File

@ -1,4 +1,3 @@
import os import os
# Neue Exportfunktion: HTML in /tmp speichern, per SCP übertragen, PNG lokal speichern # Neue Exportfunktion: HTML in /tmp speichern, per SCP übertragen, PNG lokal speichern
@ -491,11 +490,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['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) 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 # Clusteranalyse mit K-Means basierend auf den deduktiven Dimensionen
# Prüfung auf konstante deduktive Dimensionen # Prüfung auf konstante deduktive Dimensionen
if df[['X_Dimension', 'Y_Dimension', 'Z_Dimension']].nunique().eq(1).all(): if df[['X_Dimension', 'Y_Dimension', 'Z_Dimension']].nunique().eq(1).all():
@ -568,6 +562,19 @@ for cluster in cluster_means.index:
# Statische Cluster-Beschriftungen in den DataFrame einfügen # Statische Cluster-Beschriftungen in den DataFrame einfügen
df['Cluster_Label'] = df['KMeans_Cluster'].map(cluster_labels) 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 # Ausgabe der statischen Cluster-Beschriftungen
print("Cluster-Beschriftungen (inhaltlich):") print("Cluster-Beschriftungen (inhaltlich):")
@ -584,7 +591,7 @@ fig_cluster = px.scatter_3d(
color='Cluster_Label', color='Cluster_Label',
size='Point_Size', size='Point_Size',
size_max=100, size_max=100,
color_discrete_sequence=list(cluster_colors.values()), color_discrete_map=color_map,
hover_data={ hover_data={
'Cluster_Label': True, 'Cluster_Label': True,
'X_Dimension': True, 'X_Dimension': True,
@ -753,8 +760,17 @@ def plot_average_correlation_plotly(summary_df):
) )
# PNG-Export ergänzen # PNG-Export ergänzen
png_path = os.path.join(export_path_png, f"{slugify('summary_plot_' + global_bib_filename.replace('.bib', ''))}.png") 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) try:
print(f"✅ PNG-Summary-Datei gespeichert unter: {png_path}") 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 # Aufruf Alle möglichen bivariaten Korrelationen visualisieren

View File

@ -166,13 +166,6 @@ def visualize_network(bib_database):
if tag in keyword: if tag in keyword:
tag_counts[tag] += 1 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 = { search_terms_network = {
"Primäre Begriffe": { "Primäre Begriffe": {
"learning:management:system": [ "learning:management:system": [
@ -181,7 +174,7 @@ def visualize_network(bib_database):
"online:lernplattform", "online:lernplattform",
"online:lernumgebung", "online:lernumgebung",
"digital:learning", "digital:learning",
"digitales:lernen" "digital:lernen"
] ]
}, },
"Sekundäre Begriffe": { "Sekundäre Begriffe": {
@ -191,15 +184,15 @@ def visualize_network(bib_database):
], ],
"bildung:technologie": [ "bildung:technologie": [
"digital:learning", "digital:learning",
"digitales:lernen", "digital:lernen",
"blended:learning" "blended:learning"
], ],
"digital:learning": [ "digital:learning": [
"digitale:medien", "digital:medien",
"online:learning" "online:learning"
], ],
"digitales:lernen": [ "digital:lernen": [
"digitale:medien", "digital:medien",
"online:lernen" "online:lernen"
], ],
"blended:learning": ["mooc"] "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() G = nx.Graph()
hierarchy_colors = { hierarchy_colors = {