当我使用matplotlib
绘制图形时如何保存它而没有额外的边距?
通常当我将其保存为
plt.savefig("figure.png") # or .pdf
我得到了一些利润:
示例:
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包有一些技巧。
答案 0 :(得分:9)
在保存之前添加以下代码以控制绘图限制。
尝试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)
答案 1 :(得分:8)
尝试plt.savefig("figure.png", bbox_inches="tight")
。
编辑:啊,你没有提到你使用的是networkx(虽然现在我看到它在标签中列出)。 bbox_inches="tight"
是紧紧裁剪人物的方法。我不知道networkx正在做什么,但我想它正在设置一些为轴添加额外空间的绘图参数。您应该在networkx而不是matplotlib中寻找解决方案。 (例如,可能是networkx正在添加轴内的空间,而不是图中;如果删除axis('off')
调用,它会是什么样子?)
答案 2 :(得分:0)
在不知道networkx的细节的情况下,我无法确定这是否有效,但是为了从matplotlib中的轴外部完全删除空白,您可以执行以下操作:
import matplotlib.pyplot as plt
ax = plt.axes([0, 0, 1, 1])
plt.plot(range(10))
答案 3 :(得分:0)
有点黑客,但如果你使用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')
答案 4 :(得分:0)
使用以下内容:
plt.margins(0.0)
答案 5 :(得分:0)
要使图形居中,您可以使用以下内容:
cut = 1.1
xmax = max(xx for xx,yy in pos.values())
ymax = max(yy for xx,yy in pos.values())
xmin = min(xx for xx,yy in pos.values())
ymin = min(yy for xx,yy in pos.values())
xincrease = (cut - 1)*xmax
yincrease = (cut - 1)*ymax
plt.xlim(xmin - xincrease, cut*xmax)
plt.ylim(ymin - yincrease, cut*ymax)