如何在直方图中绘制具有相同标签号的多个要素

时间:2019-03-20 00:49:30

标签: python python-2.7 matplotlib histogram

我有一个包含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种对齐方式(leftmidright )。我正在查看的是所有8个特征的直方图,该直方图根据标签号将特征分开。像这样的图:

enter image description here

1 个答案:

答案 0 :(得分:1)

这里不需要直方图,并且可以使用条形图轻松生成所需的图形,因为您仅在此处绘制单个频率。这个想法如下:

  • 使用Counter中的collections模块来获得1、2和3的频率。
  • 条形图的x位置将围绕1、2和3居中。但是,要获得理想的效果,您可以通过偏移x位置来调整它们:前4个条形1、2、3左边的条形,以及1、2、3右边的下4个条形。可以使用偏移参数(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