Как покрасить узлы в сети на основе неуникального свойства? - PullRequest
0 голосов
/ 05 марта 2019

Скажем, у меня есть следующие данные в кадре данных:

В столбце Comment содержатся комментарии пользователей;в колонке Topic я выделил основную тему обсуждения в комментарии;в колонке Opinion я извлек мнение о теме на основе комментария пользователя;столбец Sentiment содержит настроение комментария пользователя;в столбце Topic Count указано, сколько раз тема появляется в данных;а в столбце Opinion Count указывается, сколько раз мнение появляется в данных.

import pandas as pd

dataset = pd.DataFrame(columns=['Comment', 'Topic', 'Opinion', 'Sentiment', 'Topic Count', 'Opinion Count'])
dataset.Comment = ['xyz', 'wvx', 'uvw', 'rpo', 'tyr', 'rgy', 'tyr', 'opi', 'vmm', 'erw']
dataset.Topic = ['service', 'service', 'payment', 'payment', 'payment', 'service', 'service', 'payment', 'service', 'service']
dataset.Opinion = ['ok', 'ok', 'easy', 'difficult', 'inconvenient', 'inconvenient', 'good', 'good', 'ok', 'ok']
dataset.Sentiment = ['good', 'neutral', 'good', 'bad', 'bad', 'neutral', 'neutral', 'good', 'neutral', 'good']
dataset['Topic Count'] = [6, 6, 4, 4, 4, 6, 6, 4, 6, 6]
dataset['Opinion Count'] = [4, 4, 1, 1, 2, 2, 2, 2, 4, 4]

Теперь, скажем, я хочу создать сетевой график для темы service - то есть график, который соединяетвсе мнения о теме service.Я могу сделать это так:

import networkx as nx
import matplotlib.pyplot as plt
from collections import Counter as C

df = dataset[dataset['Topic']=='service']
df = df.reset_index()

df_temp = pd.DataFrame(columns=['Word', 'Count'])
df_temp.Word = C(df.Opinion).keys()
df_temp.Count = C(df.Opinion).values()

for i in range(len(df)):
    for j in range(len(df_temp)):
        if df['Opinion'][i] == df_temp['Word'][j]:
            df['Opinion Count'][i] = df_temp['Count'][j]

G = nx.Graph()
for i in range(len(df)):
    G.add_edges_from([(df['Topic'][i], df['Opinion'][i])])

pos = nx.spring_layout(G)

dmin = 1
ncenter = 0
for n in pos:
    x, y = pos[n]
    d = (x - 0.5)**2 + (y - 0.5)**2
    if d < dmin:
        ncenter = n
        dmin = d

p = dict(nx.single_source_shortest_path_length(G, ncenter))

plt.figure(figsize=(5, 5))
nx.draw_networkx_edges(G, pos, nodelist=[ncenter], alpha=0.4)
nx.draw_networkx_nodes(G, pos, nodelist=list(p.keys()),
                       node_size=100*df['Opinion Count'],
#                        node_color=df['Colors']
                      )
nx.draw_networkx_labels(G, pos, with_labels=True, font_size=16)

plt.axis('off')
plt.title('Word Association Network of "service"', fontsize=25)
plt.show()

enter image description here

Но теперь, скажем, я хочу покрасить каждый узел в сети настроением.Я хочу покрасить bad настроения red, neutral настроения yellow и good настроения green.Я могу сделать это, добавив аргумент типа node_color=df['Colors'] в функцию nx.draw_networkx_nodes после добавления столбца с именем Colors в dataset. Но как мне это сделать, если нет гарантии, что мнение имеет уникальное мнение?

Чтобы объяснить, что я имею в виду, возьмите комментарии по теме service с помощью opinion as ok:

df[df.Opinion=='ok']

enter image description here

Мы можем видеть, что есть 4 случая ok в service, но 2из них нейтральные настроения и 2 хорошие настроения.Итак, какого цвета должен быть узел ok?Если это должно быть x% желтый, y% зеленый и z% красный, где x, y, z - это процент плохих, нейтральных и хороших настроений, соответственно, для данного мнения вучитывая тему, тогда как мне подобрать подходящий цвет, который имеет эту композицию?

...