您遇到的问题似乎是由于在matplotlib
3.2.0中引入的新的自适应缩放算法引起的。链接中指出,旧算法会对Axes.scatter做出以下处理:
对于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()
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')
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')
import matplotlib.pyplot as plt
import networkx as nx
def get_ax_size(ax):
bbox = ax.get_window_extent().transformed(ax.figure.dpi_scale_trans.inverted())
width, height = bbox.width, bbox.height
width *= 72
height *= 72
return width, height
def fix_graph_scale(ax,pos,node_size = 300):
node_radius = (node_size / 3.14159265359)**0.5
min_x = min(i_pos[0] for i_pos in pos.values())
max_x = max(i_pos[0] for i_pos in pos.values())
min_y = min(i_pos[1] for i_pos in pos.values())
max_y = max(i_pos[1] for i_pos in pos.values())
ax_size_x, ax_size_y = get_ax_size(ax)
points_to_x_axis = (max_x - min_x)/(ax_size_x-node_radius*2)
points_to_y_axis = (max_y - min_y)/(ax_size_y-node_radius*2)
node_radius_in_x_axis = node_radius * points_to_x_axis
node_radius_in_y_axis = node_radius * points_to_y_axis
ax_min_x = min_x - node_radius_in_x_axis
ax_max_x = max_x + node_radius_in_x_axis
ax_min_y = min_y - node_radius_in_y_axis
ax_max_y = max_y + node_radius_in_y_axis
ax.set_xlim([ax_min_x, ax_max_x])
ax.set_ylim([ax_min_y, ax_max_y])
fig, (ax1, ax2) = plt.subplots(2, 1)
ax1.scatter(range(10), range(10))
G = nx.erdos_renyi_graph(20, p=0.1)
pos = nx.drawing.spring_layout(G)
nx.draw_networkx(G,pos,ax=ax2)
default_node_size = 300
fix_graph_scale(ax2,pos,node_size = default_node_size)
plt.show()
networkx
和matplotlib
?我在 2.2 版本的networkx
和 3.0.2 版本的matplotlib
上尝试了你的代码,但无论如何都无法复现你的图形。同样的情况也出现在 networkx 2.4 和 matplotlib 3.1.3 上。 - Sparky05