Как отобразить несколько объектов с одинаковым номером тега на графике гистограммы - PullRequest
2 голосов
/ 20 марта 2019

У меня есть текстовый файл, включающий 8 функций и 1 класс.Данные моего файла (data.txt):

1,1,3,2,1,1,1,3,HIGH
1,1,3,1,2,1,1,3,HIGH
1,1,1,1,3,3,1,2,HIGH
1,3,2,1,3,3,3,3,HIGH
1,3,1,2,3,1,2,1,HIGH
2,3,1,2,1,2,2,1,HIGH
2,2,2,2,2,1,2,3,HIGH
2,2,1,1,1,2,2,3,HIGH
3,2,1,3,1,3,3,3,HIGH
3,2,1,2,2,3,3,2,HIGH

В приведенном выше файле первые 8 столбцов являются функциями.Они помечены числом, которое может быть 1, 2 или 3. Последний столбец - это имя класса (HIGH).Теперь я хочу построить эти функции на основе номеров тегов.Я могу сделать это для 3 первого столбца с помощью этого кода:

import pandas as pd
from matplotlib import pyplot as plt

df = pd.read_csv('data.txt', header=None)

# Features are : A,B,C,...,H
df.columns = ['A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'class']

X = df.ix[:, 0:8].values
y = df.ix[:, 8].values

kind = ['barstacked']
deg = ['HIGH']
pos = ['left','right','mid']
col = ['r','b','y']

with plt.style.context('seaborn-whitegrid'):
    plt.figure(figsize=(8, 6))

    for j in range(0,3):
        for i in range(1):
                plt.hist(X[y == deg[i], j],
                     label=deg[i],
                     bins=30,
                     alpha=0.6, histtype=kind[i], align=pos[j], color=col[j])

    plt.tick_params(axis='both', which='major', labelsize=17)
    plt.xlim(0.75, 3.25)
    plt.tight_layout()
    plt.savefig("figure.png" , format='png', dpi=700)
    plt.show()

Вот результат: enter image description here

Однако я могНе отображайте остальные 5 столбцов, потому что я не знал, как разместить их рядом друг с другом, поскольку есть только 3 варианта выравнивания (left, mid и right).Я смотрю на гистограмму для всех 8 функций , которая разделяет элементы на основе номера тега.График такой:

enter image description here

1 Ответ

1 голос
/ 20 марта 2019

Здесь вам не нужна гистограмма, и вы можете легко сгенерировать нужную фигуру, используя гистограмму, потому что вы просто строите здесь одну частоту. Идея заключается в следующем:

  • Используйте Counter модуль из collections, чтобы получить частоту 1, 2 и 3.
  • X-позиции для вашей гистограммы будут сосредоточены вокруг 1, 2 и 3. Однако, , чтобы получить желаемый эффект, вы можете настроить X-позиции, смещая их: первые 4 бара для слева от 1, 2, 3 и следующих 4 столбцов справа от 1, 2, 3. Это можно сделать с помощью параметра смещения (j-4)*0.1, который вы добавляете к значениям x. Здесь 0.1 служит хорошим выбором ширины стержня.
  • Вам не нужен дополнительный цикл над i здесь, поскольку он всегда равен 0
  • df.ix устарела в новых версиях панд. Вам придется использовать df.iloc вместо.

Вот как вы можете это сделать.

df.columns = ['A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'class']

X = df.ix[:, 0:8].values
y = df.ix[:, 8].values

with plt.style.context('seaborn-whitegrid'):
    plt.figure(figsize=(8, 6))
    for j in range(0,8):
            freqs = Counter(X[y == deg[0], j])
            xvalues = np.array(list(freqs.keys()))
            plt.bar(xvalues+(j-4)*0.1, freqs.values(), width=0.1, 
                    alpha=0.9, edgecolor='k', lw=2)
    plt.tick_params(axis='both', which='major', labelsize=17)
    plt.xlim(0.25, 3.75)
    plt.xticks([1,2,3])
    plt.tight_layout()
    plt.show()

enter image description here

...