Plotten des Listenwörterbuchs (Einbettung von Themenwörtern) in Python3.x

Oct 14 2020

Ich habe ein Wörterbuch namens "topic_word"

topic_word = {0: [[-0.669712, 0.6868, 0.9821409999999999], [-0.925967, 0.6138399999999999, 1.247525], [-1.09941, 1.0252620000000001, 1.327866]], 
1: [[-0,862131, 0,890915, 1,07759], [-0,437658, 0,279271, 0,627497], [-0,437658, 0,279271, 0,627497]], 
2: [[-0,671647, 0,670583, 0,937155], [-0,675347, 0,466983, 0,8505440000000001], [-0,706244, 0,612532, 0,762877]], 
3: [[-0,8414590000000001, 0,797826, 1,124295], [-0,567535, 0,40820300000000004, 0,811368], [-0,800963, 0,699767, 0,923798999999999999]], 
4: [[-0,8560549999999999, 1,0617020000000001, 1,579302], [-0,576105, 0,5029239999999999, 0,9392], [-0,743683, 0,69884, 0,9794930000000001]]
}}

Dabei steht jeder Schlüssel für ein Thema (hier 0 bis 4; 5 Themen) und der Wert für die Einbettung von Wörtern unter jedem Thema (hier hat jedes Thema 3 Wörter).
Ich möchte Daten mithilfe eines
2D -Streudiagramms visualisieren, wenn ich normalisieren muss, wie ich "topic_word" -Daten normalisieren kann, die ich in Python 3.x korrekt darstellen kann

So visualisieren Sie es mithilfe eines Streudiagramms, in dem Wortgruppen (Punkte) unter ihren Themen angezeigt werden.
etwas wie unten:

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()

for key, value in topic_word.items():
   ax.scatter(value[0],value[1],label=key)
plt.legend()

Antworten

1 Sameeresque Oct 14 2020 at 16:18

Ich entnehme Ihrem Beitrag, dass Sie normalisierte Werte für jede Liste haben möchten, die einem Schlüssel entspricht. Und jede dieser normalisierten Listen wird als Streudatenpunkte dargestellt. Hier ist eine Möglichkeit, dies zu tun:

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
topic_word = {0: [[-0.669712, 0.6868, 0.9821409999999999], [-0.925967, 0.6138399999999999, 1.247525], [-1.09941, 1.0252620000000001, 1.327866]], 
1: [[-0.862131, 0.890915, 1.07759], [-0.437658, 0.279271, 0.627497], [-0.437658, 0.279271, 0.627497]], 
2: [[-0.671647, 0.670583, 0.937155], [-0.675347, 0.466983, 0.8505440000000001], [-0.706244, 0.612532, 0.762877]], 
3: [[-0.8414590000000001, 0.797826, 1.124295], [-0.567535, 0.40820300000000004, 0.811368], [-0.800963, 0.699767, 0.9237989999999999]], 
4: [[-0.8560549999999999, 1.0617020000000001, 1.579302], [-0.576105, 0.5029239999999999, 0.9392], [-0.743683, 0.69884, 0.9794930000000001]]
}
colorkey={0:'red',1:'blue',2:'green',3:'black',4:'magenta'} # creating a color map for keys
for key, value in topic_word.items():
    valno=0 # keeping a count of number of lists under each topic_word (key)
    for val in value:
        meanval=np.mean(val) 
        stdval=np.std(val)
        val = (val-meanval)/(stdval) # normalized list
        ax.scatter(key*np.ones(len(val)),val,color=colorkey[key],label="Topic "+str(key) if valno == 0 else "") # label is done such that duplication of legend elements is avoided
        handles, labels = ax.get_legend_handles_labels()
        valno=valno+1
fig.legend(handles, labels, loc='best')