【问题标题】:my box plot has no output in jupyter notebook我的箱形图在 jupyter notebook 中没有输出
【发布时间】:2020-12-12 14:47:31
【问题描述】:

这是我的代码,我不知道我做错了什么。没有错误,但是当我得到我的结果时,它并没有显示箱线图,只是一个 x 轴和一个带有数字的 y 轴。

import numpy as np
import matplotlib.pyplot as plt
#read in the dataset
data= np.genfromtxt("C:\\Users\\pearlyn\\Downloads\\education qualification.csv",
        delimiter=',',
        names=True, dtype=('U7','U10','U30','U4',int))
race = data[(data['mother_race']=='INDIAN')]
race_1 = race[race['birth_order']=='1st']
race_2= race_1[race_1['month']== '2019-12']

catA = race_2[race_2['mother_education'] == '"A" LEVEL/DIPLOMA']['birth_count']
catB = race_2[race_2['mother_education'] == '"N" LEVEL/"O" LEVEL']['birth_count']
catC = race_2[race_2['mother_education'] == 'NO QUALIFICATION']['birth_count']
catD = race_2[race_2['mother_education'] == 'PSLE']['birth_count']
catE = race_2[race_2['mother_education'] == 'UNIVERSITY DEGREE']['birth_count']
y_values = np.array([catA, catB, catC, catD, catE])
x_labels = np.unique(data['mother_education'])

plt.boxplot(y_values.transpose(),all(x_labels),patch_artist=True)
plt.show()

【问题讨论】:

  • 所以,在回复your last question 时,人们告诉你他们不能说太多,因为他们没有你的输入数据。为什么你认为这与这里无关?
  • 如何添加我的输入数据?
  • 请为 minimal reproducible example 发布 csv 数据。很好奇,您为什么使用numpy 而不是pandas,后者更适合按列标识符运行逻辑过滤器?
  • 在文本编辑器中打开您的 csv 数据,并在此处复制/粘贴其内容的示例(足以重现问题),并在代码块内格式化。记住 csv 是一个文本文件。

标签: python numpy matplotlib


【解决方案1】:

实际上问题是您的data 变量 Jupiter notbook 无法从您的设备获取该文件位置,因为它是在线 IDE,因此无法打开您的存储位置。您应该尝试使用 vs code 或 python 的其他 IDE,因为它们嵌入在系统中并且可以获取文件位置。 如果有帮助,请告诉我。

【讨论】:

    【解决方案2】:

    为了重现您的问题,问题可能是由于处理不支持numpy.genfromtxt 的字符串中的双引号,尤其是mother_education 值。 Numpy 的文本解析器将引号加倍并将整个值包含在引号中!因此,您的逻辑调用返回空数组,因为它们不以对象数组中的实际值为条件。

    查看下面的随机演示并打印数据。

    from io import StringIO
    import numpy as np
    import pandas as pd
    
    educ_groups = ['"A" LEVEL/DIPLOMA', '"N" LEVEL/"O" LEVEL',
                   'NO QUALIFICATION', 'PSLE', 'UNIVERSITY DEGREE']
    
    # create random dataset of two columns
    np.random.seed(20201212)
    random_df = pd.DataFrame({'mother_education': np.random.choice(educ_groups, 500),
                              'birth_count': np.random.randint(1, 15, 500),
                              })
    # create csv dataset
    csv_data = random_df.to_csv(index=False)
    
    # read in the dataset
    data = np.genfromtxt(StringIO(csv_data),
                         delimiter=',',
                         names=True, dtype=['U30', int])
    
    print(data[0:25])
    # [('"""A"" LEVEL/DIPLOMA"',  6) ('PSLE',  3) ('PSLE',  8)
    #  ('UNIVERSITY DEGREE', 13) ('"""N"" LEVEL/""O"" LEVEL"',  3) ('PSLE', 12)
    #  ('PSLE',  3) ('UNIVERSITY DEGREE',  9) ('"""N"" LEVEL/""O"" LEVEL"',  9)
    #  ('NO QUALIFICATION', 10) ('UNIVERSITY DEGREE',  8)
    #  ('UNIVERSITY DEGREE',  5) ('"""N"" LEVEL/""O"" LEVEL"',  7)
    #  ('NO QUALIFICATION',  6) ('"""N"" LEVEL/""O"" LEVEL"',  1) ('PSLE', 10)
    #  ('NO QUALIFICATION',  8) ('"""N"" LEVEL/""O"" LEVEL"', 13)
    #  ('UNIVERSITY DEGREE', 12) ('"""A"" LEVEL/DIPLOMA"',  7)
    #  ('NO QUALIFICATION',  7) ('PSLE',  6) ('PSLE',  4)
    #  ('NO QUALIFICATION', 10) ('NO QUALIFICATION', 14)]
    # [('mother_education', '<U30'), ('birth_count', '<i8')]
    
    print(data.dtype)
    # [('mother_education', '<U6'), ('birth_count', '<i8')]
    

    Numpy 修复

    一个快速的解决方法是在逻辑调用中使用渲染的 numpy 值,然后将标签调整为原始值。下面还正确标记了x 轴。

    catA = data[data['mother_education'] == '"""A"" LEVEL/DIPLOMA"']['birth_count']
    catB = data[data['mother_education'] == '"""N"" LEVEL/""O"" LEVEL"']['birth_count']
    catC = data[data['mother_education'] == 'NO QUALIFICATION']['birth_count']
    catD = data[data['mother_education'] == 'PSLE']['birth_count']
    catE = data[data['mother_education'] == 'UNIVERSITY DEGREE']['birth_count']
    
    y_values = np.array([catA, catB, catC, catD, catE], dtype='object')
    x_labels = np.unique(['"A" LEVEL/DIPLOMA', '"N" LEVEL/"O" LEVEL',
                          'NO QUALIFICATION', 'PSLE', 'UNIVERSITY DEGREE'])
    
    plt.figure(figsize=(15,5))
    plt.boxplot(y_values.transpose(), labels=x_labels, notch=False, patch_artist=True)
    plt.show()
    


    熊猫绘图构建

    然而,正如评论 pandas 可能是一个更好的工具,尤其是处理不同的 dtype 数据集,例如具有分组聚合需求的字符串类别和数值。 (Numpy 最适用于所有元素的原子、相似类型的 n 维数据集。Pandas 最适用于不同类型的二维数据集。)此外,pandas.read_csv 可以正确处理字符串中的引号以及一系列其他 @987654322 @。

    df = pd.read_csv(StringIO(csv_data))   # REPLACE WITH ACTUAL FILE
    
    df.boxplot(column='birth_count', by='mother_education', 
               figsize=(15,5), grid=False, patch_artist=True)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      相关资源
      最近更新 更多