метка networkx отключается

#python #data-visualization #networkx

#python #визуализация данных #networkx

Вопрос:

У меня есть следующий код, который создает изображение, но метки отсекаются. Я специально отредактировал первое значение в каждом df столбце, поскольку мои реальные данные имеют действительно большие метки. Я пробовал plt.tight_layout , но это не работает.

Я также попробовал решение по следующей ссылке, но безуспешно. Это только сдвинуло изображение влево.

Я также попытался увеличить ширину figsize , и, хотя я делаю ее достаточно большой, отображается вся метка, изображение выглядит действительно крошечным и растянутым.

Я также пытался bbox_inches='tight' при сохранении, но сохраненное изображение все еще имеет обрезанные метки. Я хотел бы, чтобы мои метки были полностью видны, а также чтобы метки левой стороны были сдвинуты влево от узлов, а метки правой стороны были сдвинуты вправо от меток.

 import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

ani_foo = {'Animal': ['CattttttttttttttttttttttttttEND','Cat','Cat','Cat','Cat','Cat','Cat','Cat','Cat','Cat','Dog','Dog','Dog','Dog','Dog','Dog','Dog','Dog','Dog','Snake','Snake','Snake','Snake'],
        'Food': ['Hard_FooddddddddddddddddddddddddEND','Hard_Food','Hard_Food','Hard_Food','Soft_Food','Soft_Food','Soft_Food','Mouse','Soft_Food','Soft_Food','Hard_Food','Hard_Food','Hard_Food','Hard_Food','Soft_Food','Soft_Food','Soft_Food','Soft_Food','Meat','Mouse','Meat','Meat','Meat']
        }

df = pd.DataFrame(ani_foo, columns = ['Animal', 'Food'])

fig, ax = plt.subplots(figsize=(15,8))
G = nx.from_pandas_edgelist(df, 'Animal', 'Food')
G.add_nodes_from(df['Animal'], bipartite=0)
G.add_nodes_from(df['Food'], bipartite=1)
s = df.stack().value_counts()
s1 = s.index  'n'  s.astype(str)
pos = {node:[0, i] for i, node in enumerate(df['Animal'])}
pos.update({node:[1,i] for i, node in enumerate(df['Food'])})
color_dict = {'Cat':'g', 'Dog':'b', 'Snake':'y'}
ec = [color_dict[c] for i in G.edges for c in i if c in color_dict.keys()]
nx.draw_networkx(G, 
                 node_size=[s[i]*250 for i in G.nodes], 
                 pos=pos, 
                 labels = s1.to_dict(), 
                 node_color='lightblue',
                 edge_color=ec)
plt.tight_layout
plt.axis('off')
  

что приводит к следующему нежелательному изображению:

введите описание изображения здесь

Комментарии:

1. plt.margins(x=0.4) создает больше места перед первым тиком и после последнего.

2. Спасибо… почти слишком просто! На самом деле я нашел очень элементарный способ сделать это, добавив «фиктивные узлы» в 0,0 и 3,0 и раскрасив их в белый цвет с белыми метками и без ребер