Добавление аннотации над точкой matplotlib - PullRequest
0 голосов
/ 20 марта 2020

Я только начал изучать python, и у меня возникла небольшая проблема с моим кодом, мне нужно добавить аннотацию внутри моего графика. У меня есть несколько ссылок вроде этой ссылка аннотации

Это мой код:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


data = {
'jenis' : ['set1', 'set2', 'set3', 'set4', 'set5'],
'data1' :[0.80443, 0.84176, 0.84278, 0.82316,0.82260],
'data2' :[0.71956, 0.77691, 0.77279, 0.74522,0.74747],
'data3' :[0.84256, 0.83268, 0.84152, 0.84204,0.83775],
'data4' :[0.71956, 0.77691, 0.77279, 0.74522,0.74747],
'data5' :[0.80320, 0.83787, 0.83933, 0.82087,0.82008],
'data6' :[0.71956, 0.77043, 0.76772, 0.74286,0.74432],
'data7' :[0.83641, 0.83009, 0.83847, 0.83743,0.83333],
'data8' :[0.71956, 0.77043, 0.76772, 0.74286,0.74432],
}

df = pd.DataFrame.from_dict(data); df
fig = plt.figure(figsize=(8,4))
ax1=plt.subplot(111)
ax1.plot(df.jenis, [ x * 100 for x in df.data1 ],'s-')
ax1.plot(df.jenis, [ x * 100 for x in df.data2 ],'s-')
ax1.plot(df.jenis, [ x * 100 for x in df.data3 ],'s-')
ax1.plot(df.jenis, [ x * 100 for x in df.data4 ],'s-')
ax1.plot(df.jenis, [ x * 100 for x in df.data5 ],'s-')
ax1.plot(df.jenis, [ x * 100 for x in df.data6 ],'s-')
ax1.plot(df.jenis, [ x * 100 for x in df.data7 ],'s-')
ax1.plot(df.jenis, [ x * 100 for x in df.data8 ],'s-')
plt.ylim([60, 100])
plt.legend(
    ['Skenario 1',
     'Skenario 2',
     'Skenario 3',
     'Skenario 4',
     'Skenario 5',
     'Skenario 6',
     'Skenario 7',
     'Skenario 8'
     ],
    loc='best'
    )

for i,j in df.data1.items():
    ax1.annotate(str(j), xy=(i, j))
for i,j in df.data2.items():
    ax1.annotate(str(j), xy=(i, j))
for i,j in df.data3.items():
    ax1.annotate(str(j), xy=(i, j))
for i,j in df.data4.items():
    ax1.annotate(str(j), xy=(i, j))
for i,j in df.data5.items():
    ax1.annotate(str(j), xy=(i, j))
for i,j in df.data6.items():
    ax1.annotate(str(j), xy=(i, j))
for i,j in df.data7.items():
    ax1.annotate(str(j), xy=(i, j))
for i,j in df.data8.items():
    ax1.annotate(str(j), xy=(i, j))

plt.ylabel('Akurasi')
plt.title('Performance Measurements')
plt.show()

Я не получил ошибку, но результаты ничто enter image description here

Я хочу, чтобы окончательные результаты возвращали значение из моих данных, как это enter image description here

Может кто-нибудь, пожалуйста, помогите мне?

1 Ответ

2 голосов
/ 20 марта 2020

Проблема заключается в том, что для построения графика данные умножаются на 100, но для аннотаций нет умножения для позиции y.

Таким образом, решение будет выглядеть так:

ax1.annotate(str(j), xy=(i, j*100))

Поскольку есть много точек близко друг к другу, сюжет быстро выглядит слишком занятым. Библиотека mplcursors может пригодиться. Он показывает аннотацию при наведении на график.

Вот некоторый демонстрационный код для начала работы:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import mplcursors

data = {'jenis': ['set1', 'set2', 'set3', 'set4', 'set5'],
        'data1': [0.80443, 0.84176, 0.84278, 0.82316, 0.82260],
        'data2': [0.71956, 0.77691, 0.77279, 0.74522, 0.74747],
        'data3': [0.84256, 0.83268, 0.84152, 0.84204, 0.83775],
        'data4': [0.71956, 0.77691, 0.77279, 0.74522, 0.74747],
        'data5': [0.80320, 0.83787, 0.83933, 0.82087, 0.82008],
        'data6': [0.71956, 0.77043, 0.76772, 0.74286, 0.74432],
        'data7': [0.83641, 0.83009, 0.83847, 0.83743, 0.83333],
        'data8': [0.71956, 0.77043, 0.76772, 0.74286, 0.74432]}
df = pd.DataFrame.from_dict(data)

fig = plt.figure(figsize=(8, 4))
ax1 = plt.subplot(111)
for i, data_col in enumerate( df.columns[1:]):
    ax1.plot(df.jenis, [x * 100 for x in df[data_col]], 's-', label=f'Skenario {i+1}')
plt.ylim([60, 100])

# optionally show annotations
# for data_col in df.columns[1:]:
#     for i,j in df[data_col].items():
#         ax1.annotate(str(j), xy=(i, j*100))

mplcursors.cursor(hover=True)

plt.ylabel('Akurasi')
plt.title('Performance Measurements')
plt.legend(loc='best')
plt.show()

example plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...