Подтвердить что ты не робот

Сохранение матрицы 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.

4b9b3361

Ответ 1

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

попробуйте разные значения 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)

Ответ 2

Попробуйте plt.savefig("figure.png", bbox_inches="tight").

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

Ответ 3

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

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

Ответ 4

Немного взлома, но если вы используете nx.draw, то он будет более плотным.

Итак, вы могли бы сделать

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')

Ответ 5

Используйте следующее:

plt.margins(0.0)