Графики с разными типами узлов - PullRequest
0 голосов
/ 23 мая 2019

У меня есть следующие даты pandas:

df = pd.DataFrame({
'id_emp':[13524791000109, 12053850000137, 4707821000113],
'name_emp': [
    'JL Consultores',
    'GRAAL OURINHOS',
    'SOJA COMERCIO DE DERIVADOS DE PETROLEO LTDA'
],
'name_dep': [
    'DIONILSO MATEUS MARCON',
    'JOSE AUGUSTO ROSA',
    'LUCIO ANTONIO MOSQUINI'
],
'donnated_value': [ 750.00, 5000.00, 27350.00],
'donnated_amount': [1,1,1],
'reimbursed_value':[36000.00,410.55, 241.22],
'amount_reimbursed': [1,2,1],
'roi':[4800.00, 8.21,0.88]
})

Из этого кадра данных я строю график с кодом ниже:

# Create graph
G = nx.Graph()
# Add id_emp nodes
G.add_nodes_from(df['id_emp'])
# Set 'name_emp' attribute for 'name_emp' column values
for node in G.nodes:
   G.nodes[node]['name_emp'] = df.loc[df['id_emp'] == node]['name_emp'].values[0]
# Add name_dep nodes
G.add_nodes_from(df['name_dep'])
# Create the new column with transformed 'roi' values
df['roi_new'] = df['roi'].apply(
lambda x: 1 if x < 100 else 2 if 100 <= x < 1000 else 3)
# Add weighted edges
G.add_weighted_edges_from(df[['id_emp', 'name_dep', 'roi_new']].values)

Мне нужно улучшить визуализацию этого графика,Для этого я бы хотел, чтобы узлы из df ['id_emp' и df ['name_dep'] были другого цвета и формата.Кроме того, в идеале каждый тип узла должен быть на разных сторонах.Пример: узлы df ['id_emp] останутся в верхней части рисунка, а остальные останутся внизу.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 23 мая 2019
  1. Добавьте атрибут 'type_' для всех узлов, представляющих его, id_emp или name_dep (замените существующие строки кода, не добавляйте их!):
# Add id_emp nodes
G.add_nodes_from(df['id_emp'], type_='id_emp')
...
# Add name_dep nodes
G.add_nodes_from(df['name_dep'], type_='name_dep')
  1. Набор colors список для дальнейшей раскраски узла:
colors = ['#0000FF' if G.nodes[n]['type_'] == 'id_emp' else '#FF0000' for n in G.nodes]
  1. Установить pos dict для дальнейшего позиционирования узла (нужен модуль random и возвращает не идеальные результаты; если вы хотите лучше нарисовать узлы / ребра, вам нужен более сложный анализ графа):
pos = {
    n: (
        random.random(),
        0 if G.nodes[n]['type_'] == 'id_emp' else 1
    )
    for n in G.nodes
}
  1. Нарисуйте график:
nx.draw(
    G,
    pos=pos,
    node_color=colors,
    with_labels=True
)

enter image description here

Подробнее о networkx графике можно прочитать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...