【问题标题】:How to plot multiple features with the same tag number in histogram plot如何在直方图中绘制具有相同标签编号的多个特征
【发布时间】:2019-08-10 15:09:06
【问题描述】:

我有一个包含 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()

结果如下:

但是我无法绘制其他 5 列,因为我不知道如何将它们放在一起,因为只有 3 个对齐选项(leftmidright)。我正在查看的是 所有 8 个功能 的直方图,它根据标签号分隔功能。像这样的图表:

【问题讨论】:

    标签: python python-2.7 matplotlib histogram


    【解决方案1】:

    您在这里不需要直方图,您可以使用条形图轻松生成所需的数字,因为您只是在此处绘制单个频率。思路如下:

    • 使用collections中的Counter模块获取1、2和3的频率。
    • 条形图的 x 位置将以 1、2 和 3 为中心。但是,要获得所需的效果,您可以通过偏移来调整 x 位置:前 4 个条形图1、2、3 的左侧和 1、2、3 右侧的接下来的 4 个柱。这可以使用添加到 x 值的偏移参数 (j-4)*0.1 来完成。这里 0.1 是条形宽度的不错选择。
    • 您不需要在 i 上进行额外循环,因为它始终为 0
    • df.ix 在较新的 pandas 版本中已弃用。您必须改用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()
    

    【讨论】:

    • 谢谢。这正是我想要的。无论如何,我可以将与每个条的高度相对应的数字放在相应条的顶部吗?例如,我想在最左边的蓝色条的顶部看到数字 5。其他 23 个酒吧也是如此。
    • @Leo:有可能。已经有几个关于如何做到这一点的 Stack Overflow 答案。我建议您阅读它们。例如:thisthisofficial example。尝试一下,如果它不起作用,我建议发布另一个具有特定问题的新问题。
    • 我一定会检查出来的。再次感谢您的帮助。
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2018-05-07
    • 2020-02-07
    • 2019-11-08
    • 2019-03-08
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多