Диаграмма рассеяния Matplotlib с различным текстом в каждой точке данных
Я пытаюсь составить точечный график и аннотировать точки данных различными номерами из списка.
Так, например, я хочу построить y
против x
и аннотировать соответствующими числами из n
.
y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]
ax = fig.add_subplot(111)
ax1.scatter(z, y, fmt='o')
Есть идеи?
Ответы
Ответ 1
Я не знаю ни одного метода построения графиков, который бы использовал массивы или списки, но вы могли бы использовать annotate()
, перебирая значения в n
.
y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]
fig, ax = plt.subplots()
ax.scatter(z, y)
for i, txt in enumerate(n):
ax.annotate(txt, (z[i], y[i]))
Существует множество параметров форматирования для annotate()
, см. Веб-сайт matplotlib:
![enter image description here]()
Ответ 2
В версии, более ранней, чем matplotlib 2.0, ax.scatter
не требуется ax.scatter
текст без маркеров. В версии 2.0 вам понадобится ax.scatter
чтобы установить правильный диапазон и маркеры для текста.
y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]
fig, ax = plt.subplots()
for i, txt in enumerate(n):
ax.annotate(txt, (z[i], y[i]))
И в этой ссылке вы можете найти пример в 3d.
Ответ 3
В случае, если кто-то пытается применить вышеуказанные решения к .scatter() вместо .subplot(),
Я попытался запустить следующий код
y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]
fig, ax = plt.scatter(z, y)
for i, txt in enumerate(n):
ax.annotate(txt, (z[i], y[i]))
Но натолкнулся на ошибки, в которых говорилось, что "невозможно распаковать не повторяемый объект PathCollection", а ошибка указывает на кодовую строку fig, ax = plt.scatter(z, y)
Я в конце концов решил ошибку, используя следующий код
plt.scatter(z, y)
for i, txt in enumerate(n):
plt.annotate(txt, (z[i], y[i]))
Я не ожидал, что будет разница между .scatter() и .subplot(), я должен был знать лучше.
Ответ 4
Вы также можете использовать pyplot.text
(см. здесь).
def plot_embeddings(M_reduced, word2Ind, words):
""" Plot in a scatterplot the embeddings of the words specified in the list "words".
Include a label next to each point.
"""
for word in words:
x, y = M_reduced[word2Ind[word]]
plt.scatter(x, y, marker='x', color='red')
plt.text(x+.03, y+.03, word, fontsize=9)
plt.show()
M_reduced_plot_test = np.array([[1, 1], [-1, -1], [1, -1], [-1, 1], [0, 0]])
word2Ind_plot_test = {'test1': 0, 'test2': 1, 'test3': 2, 'test4': 3, 'test5': 4}
words = ['test1', 'test2', 'test3', 'test4', 'test5']
plot_embeddings(M_reduced_plot_test, word2Ind_plot_test, words)
![enter image description here]()
Ответ 5
Вы также можете получить точечный график с метками всплывающей подсказки при наведении курсора, используя библиотеку mpld3. https://mpld3.github.io/examples/scatter_tooltip.html