Построение результатов классификации в разные даты? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть фрейм данных (my_data) следующим образом:

       0      2017-01  2017-02  2017-03  2017-04
 0     S1        2        3        2        2
 1     S2        2        0        2        0
 2     S3        1        0        2        2
 3     S4        3        2        2        2
 4     …         …        …        …        …
 5     …         …        …        …        …
 6     S10       2        2        3        2

Этот фрейм данных является результатом проблемы классификации в разные даты для каждого образца (S1, .., S10).Чтобы упростить построение графика, я преобразовал матрицу путаницы в разные числа следующим образом: 0 означает «TP», 1 означает «FP», 2 означает «TN» и 3 указывает «FN».Теперь я хочу построить этот фрейм данных, как показано на картинке ниже.

enter image description here

Следует отметить, что я уже задавал этот вопрос, но никто не могПомоги мне.Итак, теперь я попытался облегчить понимание вопроса, чтобы я мог получить помощь.

1 Ответ

0 голосов
/ 11 февраля 2019

К сожалению, я не знаю способа построения одного набора данных с разными маркерами, поэтому вам придется наносить на график все ваши данные отдельно.

Вы можете использовать matplotlib для построения ваших данных.Я не уверен, как выглядят ваши данные, но для файла с таким содержанием:

2017-01,2017-02,2017-03,2017-04
2,3,2,2
2,0,2,0
1,0,2,2
3,2,2,2
2,2,3,2

Вы можете использовать следующий код, чтобы получить нужный график:

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

fig, ax = plt.subplots()

df = pd.read_csv('dataframe.txt', parse_dates = True)
dates = list(df.columns.values) #get dates
number_of_dates = len(dates)
markers = ["o", "d", "^", "s"] #set marker shape
colors = ["g", "r", "m", "y"] #set marker color

# loop over the data in your dataframe
for i in range(df.shape[0]):
     # get a row of 1s, 2s, ... as you want your
     # data S1, S2, in one line on top of each other
    dataY = (i+1)*np.ones(number_of_dates)

    # get the data that will specify which marker to use
    data = df.loc[i]

    # plot dashed line first, setting it underneath markers with zorder
    plt.plot(dates, dataY, c="k", linewidth=1, dashes=[6, 2], zorder=1)

    # loop over each data point x is the date, y a constant number,
    # and data specifies which marker to use
    for _x, _y, _data in zip(dates, dataY, data):
        plt.scatter(_x, _y, marker=markers[_data], c=colors[_data], s=100, edgecolors="k", linewidths=0.5, zorder=2)

# label your ticks S1, S2, ...
ticklist = list(range(1,df.shape[0]+1))
l2 = [("S%s" % x) for x in ticklist]
ax.set_yticks(ticklist)
ax.set_yticklabels(l2)

labels = ["TP","TN","FP","FN"]
legend_elements = []
for l,c, m in zip(labels, colors, markers):
    legend_elements.append(Line2D([0], [0], marker=m, color="w", label=l, markerfacecolor=c, markeredgecolor = "k", markersize=10))

ax.legend(handles=legend_elements, loc='upper right')

plt.show()

Plottingидея из этого ответа .

В результате график выглядит следующим образом: dynamic plot markers

РЕДАКТИРОВАТЬ Добавлен пунктирлиния и контур маркеров, чтобы они больше походили на рассматриваемый пример.

EDIT2 Добавлена ​​легенда.

...