Diese Frage ist eine Folge zu this. Wie kann ich die Anmerkungen so gestalten, dass sie immer noch lesbar sind, wenn die markierten Punkte genau oder nahezu deckungsgleich sind? Ich brauche eine programmatische Lösung, Hand-Tuning der Offsets ist keine Option. Probe mit hässlichen Etiketten:Pyplot Label Scatter Plot mit übereinstimmenden Punkten/überlappenden Annotationen
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
N = 10
data = np.random.random((N, 4))
data[1, :2] = data[0, :2]
data[-1, :2] = data[-2, :2] + .01
labels = ['point{0}'.format(i) for i in range(N)]
plt.subplots_adjust(bottom = 0.1)
plt.scatter(
data[:, 0], data[:, 1], marker = 'o', c = data[:, 2], s = data[:, 3]*1500,
cmap = plt.get_cmap('Spectral'))
for label, x, y in zip(labels, data[:, 0], data[:, 1]):
plt.annotate(
label,
xy = (x, y), xytext = (-20, 20),
textcoords = 'offset points', ha = 'right', va = 'bottom',
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
plt.show()
Ich bin mir ziemlich sicher, dass matplotlib wird dies automatisch für Sie nicht tun. Sie müssen die Winkel für die Beschriftungen iterativ so bestimmen, dass sie sich nicht schneiden. Das ist eine schwierige Aufgabe, zumal es keine Garantie für eine gültige Lösung gibt. Wenn ein Punkt von anderen Punkten umgeben ist, können Sie sein Label nicht wirklich innerhalb eines bestimmten Radius platzieren. Ich glaube, du musst zuerst eine Heuristik erstellen, die du dann implementieren kannst. –