Сохранение фигуры matplotlib/networkx без полей

когда я рисую фигуру, используя matplotlib Как сохранить его без дополнительных полей? Обычно, когда я сохраняю его как

plt.savefig("figure.png") # or .pdf

Я получаю его с некоторыми полями:

enter image description here

пример:

import matplotlib.pyplot as plt
import networkx as nx

G=nx.Graph()

G.add_edge('a','b',weight=1)
G.add_edge('a','c',weight=1)
G.add_edge('a','d',weight=1)
G.add_edge('a','e',weight=1)
G.add_edge('a','f',weight=1)
G.add_edge('a','g',weight=1)

pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos,node_size=1200,node_shape='o',node_color='0.75')

nx.draw_networkx_edges(G,pos,
                width=2,edge_color='b')

plt.axis('off')
plt.savefig("degree.png", bbox_inches="tight")
plt.show() 

обновление 2:

пробелы устанавливаются внутри осей.. Это ясно, если я удалю plt.axis('off')
Поэтому я думаю, что есть какой-то трюк для использования с пакетом Networkx.

4 ответов


добавьте коды ниже, чтобы контролировать пределы участка перед сохранением.

попробуйте разные значения cut, например, от 1.05 до 1.50, пока вы не сочтете нужным.

# adjust the plot limits
cut = 1.05
xmax= cut*max(xx for xx,yy in pos.values())
ymax= cut*max(yy for xx,yy in pos.values())
plt.xlim(0,xmax)
plt.ylim(0,ymax)

попробовать plt.savefig("figure.png", bbox_inches="tight").

Edit: Ах, вы не упомянули, что используете networkx (хотя теперь я вижу, что он указан в теге). bbox_inches="tight" - это способ плотно обрезать фигуру. Я не знаю, что делает networkx, но я предполагаю, что он устанавливает некоторые параметры графика, которые добавляют дополнительное пространство к осям. Вы должны искать решение в networkx, а не matplotlib. (Возможно, например, что networkx добавляет пространство внутри оси, не понять; что похоже ли это, если вы удалите это axis('off') звонок?)


Не зная специфики networkx, я не могу быть уверен, что это сработает, но чтобы полностью удалить пробелы снаружи осей в matplotlib, вы можете сделать что-то вроде:

import matplotlib.pyplot as plt
ax = plt.axes([0, 0, 1, 1])
plt.plot(range(10))

немного взломать, но если вы используете nx.нарисуйте, затем он делает более плотную посадку.

Так что вы могли бы сделать

nx.draw(G,pos,node_size=1200,node_shape='o',node_color='0.75', edgelist = [])

который просто рисует узлы и нет края. Тогда это нормально делать

nx.draw_networkx_edges(G, pos, width=2, edge_color='b')