Невозможно сохранить график, созданный в Networkx и matplotlib - PullRequest
0 голосов
/ 27 июня 2018

Я использую NetworkX и matplotlib для рисования графика с изображениями png в качестве узлов. Вот мой код:

import networkx as nx 
import matplotlib.pyplot as plt 
G = nx.DiGraph()

#DRAWING EDGES ON AXIS 
G.add_edges_from(([1,2],[3,4],[5,6],[7,8]))
pos = nx.circular_layout(G)
fig = plt.figure(figsize=(20, 20)) 
ax = plt.axes([0, 0, 15, 15])
ax.set_aspect('equal') 
nx.draw_networkx_edges(G, pos, ax=ax, arrows=True)

#TRANSFORMING COORDINATES 
trans = ax.transData.transform 
trans2 = fig.transFigure.inverted().transform 

#PUTTING IMAGE INSTEAD OF NODES 
size = 0.2 
p2 = size / 2.0 

for n in G:
   xx, yy = trans(pos[n]) 
   xa, ya = trans2((xx, yy)) 
   a = plt.axes([xa - p2, ya - p2, size, size])
   a.set_aspect('equal')
   a.imshow(image, aspect='auto')
   a.axis('off')

plt.savefig('save.png') 
plt.show()

Блокнот Jupyter отображает график. Однако, когда я использую Pycharm, он показывает пустой белый рисунок. Сохранение с помощью plt.savefig () также не работает. Я пытался играть с dpi в plt.savefig (), но ничего не изменилось. Буду очень признателен за любые подсказки.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

plt.axes ожидает прямоугольник с координатами, выраженными в виде доли холста фигуры. Дано figsize=(20,20),

ax = plt.axes([0, 0, 15, 15])

действительно должно быть

ax = plt.axes([0, 0, 0.75, 0.75])
0 голосов
/ 30 июня 2018

Добавление bbox_inches='tight' при сохранении решило проблему:

plt.savefig('save.png',bbox_inches='tight')

Этот аргумент обрезает ненужные поля пробелов вокруг выходного изображения. Без этого сохраняется только часть целого рисунка.

Ценная дискуссия о том, как сохранить чистое изображение в matplotlib, находится здесь: scipy: savefig без рамок, осей, только контент

Вы можете найти bbox изображения внутри оси (используя get_window_extent) и используйте параметр bbox_inches только для сохранения эта часть изображения

0 голосов
/ 27 июня 2018

У меня была похожая ситуация раньше. Можете ли вы попробовать это:

import matplotlib 
matplotlib.use('Agg')
import matplotlib.pyplot as plt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...