networkx в подзаговоре рисует узлы частично за пределами кадра осей - PullRequest
0 голосов
/ 30 апреля 2020

Когда я рисую график networkx в подзаговоре, некоторые узлы частично обрезаются в кадре осей. Я пробовал это со всеми различными типами графиков и макетов, это всегда проблема. Это всегда отсекает мои узлы. Как будто networkx рисует график по большим осям, чем на самом деле.

Вот минимальный пример

plt.subplot(2, 1, 1)
plt.scatter(range(10), range(10))

plt.subplot(2, 1, 2)
G = nx.erdos_renyi_graph(20, p=0.1)
nx.draw_networkx(G)
plt.show()

Это то, что я понял из этого. Как видите, узел 0 и узел 7 не помещаются в кадр.

Minimal example

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Только игра с размерами фигурки должна помочь. Попробуйте установить больший размер фигуры с помощью параметра figsize на вспомогательных участках:

f, axs = plt.subplots(2,1,figsize=(15,15))
axs[0].scatter(range(10), range(10))
G = nx.erdos_renyi_graph(20, p=0.1)
nx.draw_networkx(G, ax=axs[1], node_color='lightgreen')

enter image description here


Вы также можете просмотреть макеты networkX ' например, spring_layout, которые позволяют инкапсулировать узлы в пределах заданного размера блока, указанного параметром scale. Вот пример:

f, axs = plt.subplots(2,1,figsize=(15,15))
axs[0].scatter(range(10), range(10))
G = nx.erdos_renyi_graph(20, p=0.05)
pos = nx.spring_layout(G, k=0.7, scale=0.05)
nx.draw_networkx(G, pos=pos, ax=axs[1], node_color='lightgreen')

enter image description here

0 голосов
/ 30 апреля 2020

Фон

Кажется, ваша проблема вызвана новым алгоритмом автоматического масштабирования , представленным в matplotlib 3.2.0. В ссылке говорится, что старый алгоритм сделал

для Axes.scatter, он сделал бы ограничения достаточно большими, чтобы не обрезать маркеры в разбросе.

Следовательно , новый алгоритм остановился, чтобы сделать это, что приводит к симпатичным узлам.

Как решить проблему

Вы можете просто увеличить длину своей оси:

import networkx as nx
import matplotlib.pylab as plt

figure = plt.subplot(2, 1, 1)
plt.scatter(range(10), range(10))

plt.subplot(2, 1, 2)
G = nx.erdos_renyi_graph(20, p=0.1)
nx.draw_networkx(G)
axis = plt.gca()
# maybe smaller factors work as well, but 1.1 works fine for this minimal example
axis.set_xlim([1.1*x for x in axis.get_xlim()])
axis.set_ylim([1.1*y for y in axis.get_ylim()])
plt.show()
...