python散点图怎么设标签_如何改进matplotlib散点图的标签放置(代码、算法、提示)?...

这篇博客介绍了如何使用NetworkX的spring_layout方法重新调整数据节点的位置,使其适应单位正方形,并通过repel_labels函数防止标签重叠。通过调整k参数,可以控制节点之间的最佳距离,从而影响注释与数据点的间距。示例代码展示了如何应用这些方法到散点图上,并通过调整轴限确保所有元素可见。
摘要由CSDN通过智能技术生成

Networkx布局方法,如nx.spring_layout重新调整位置,使它们都适合一个单位正方形(默认情况下)。甚至固定的data_nodes的位置也被重新缩放。因此,要将pos应用于原始scatter_data,必须执行取消提升和取消缩放。

还要注意,nx.spring_layout有一个控制节点之间最佳距离的k参数。随着k的增加,注释与数据点的距离也会增加。import numpy as np

import matplotlib.pyplot as plt

import networkx as nx

np.random.seed(2016)

N = 20

scatter_data = np.random.rand(N, 3)*10

def repel_labels(ax, x, y, labels, k=0.01):

G = nx.DiGraph()

data_nodes = []

init_pos = {}

for xi, yi, label in zip(x, y, labels):

data_str = 'data_{0}'.format(label)

G.add_node(data_str)

G.add_node(label)

G.add_edge(label, data_str)

data_nodes.append(data_str)

init_pos[data_str] = (xi, yi)

init_pos[label] = (xi, yi)

pos = nx.spring_layout(G, pos=init_pos, fixed=data_nodes, k=k)

# undo spring_layout's rescaling

pos_after = np.vstack([pos[d] for d in data_nodes])

pos_before = np.vstack([init_pos[d] for d in data_nodes])

scale, shift_x = np.polyfit(pos_after[:,0], pos_before[:,0], 1)

scale, shift_y = np.polyfit(pos_after[:,1], pos_before[:,1], 1)

shift = np.array([shift_x, shift_y])

for key, val in pos.items():

pos[key] = (val*scale) + shift

for label, data_str in G.edges():

ax.annotate(label,

xy=pos[data_str], xycoords='data',

xytext=pos[label], textcoords='data',

arrowprops=dict(arrowstyle="->",

shrinkA=0, shrinkB=0,

connectionstyle="arc3",

color='red'), )

# expand limits

all_pos = np.vstack(pos.values())

x_span, y_span = np.ptp(all_pos, axis=0)

mins = np.min(all_pos-x_span*0.15, 0)

maxs = np.max(all_pos+y_span*0.15, 0)

ax.set_xlim([mins[0], maxs[0]])

ax.set_ylim([mins[1], maxs[1]])

fig, ax = plt.subplots()

ax.scatter(scatter_data[:, 0], scatter_data[:, 1],

c=scatter_data[:, 2], s=scatter_data[:, 2] * 150)

labels = ['ano_{}'.format(i) for i in range(N)]

repel_labels(ax, scatter_data[:, 0], scatter_data[:, 1], labels, k=0.008)

plt.show()

具有k=0.011产量

Za4XZ.png

以及k=0.008的产量

AcTUI.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值