Скажем, у меня есть следующие данные в кадре данных:
В столбце 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](https://i.stack.imgur.com/dndfT.png)
Но теперь, скажем, я хочу покрасить каждый узел в сети настроением.Я хочу покрасить 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](https://i.stack.imgur.com/KmL9r.png)
Мы можем видеть, что есть 4 случая ok
в service
, но 2из них нейтральные настроения и 2 хорошие настроения.Итак, какого цвета должен быть узел ok
?Если это должно быть x%
желтый, y%
зеленый и z%
красный, где x
, y
, z
- это процент плохих, нейтральных и хороших настроений, соответственно, для данного мнения вучитывая тему, тогда как мне подобрать подходящий цвет, который имеет эту композицию?