【问题标题】:Plotting non-numerical data (categoerical) in python在python中绘制非数值数据(分类)
【发布时间】:2021-08-09 15:18:48
【问题描述】:

我有以下数据框:

date       item_1  item_2
01-01-2021  Low     High
02-01-2021  High    Low
02-01-2021  Low     Low
03-01-2021  Medium    High

我想绘制一个条形图,将日期作为 X 轴,将项目作为 Y 轴。现在对于 1 月 1 日的 item_1,bar 会一直到低,item_2 会一直到高。 1 月 2 日 item_1 将升至高位,但也会在低位放置一个标记,因为同一日期 item_1 有另一个低位条目。以下是预期结果。

【问题讨论】:

  • 无论如何,您都应该将 Low、Med、High 值转换为 1、2、3,然后绘制它,然后更改坐标轴标签。
  • @PerroNoob OP 可以做到这一点,但 matplotlib plots categorical data as well.
  • 我试过 df.plot(x ='date', y=['item_1'], kind = 'bar') 但得到 TypeError: no numeric data to plot。

标签: python-3.x dataframe matplotlib


【解决方案1】:

我能想到的最简单的方法是将您的分类(或在您的情况下为序数)数据“重新编码”为数字。这将允许您轻松绘制数据。绘制后,您可以调整图形的标签以显示类别而不是数字。使用这种方法,您将能够添加、删除和重新排序您认为合适的类别。

import matplotlib.pyplot as plt
import pandas as pd

values_1 = ['Low', 'High', 'Low', 'Medium']
values_2 = ['High', 'Low', 'Low', 'High']
dates = pd.to_datetime(['2021-01-01', '2021-01-02', '2021-01-02', '2021-01-03' ])
cols = ['date', 'item_1', 'item_2']
df = pd.DataFrame({'dates': dates, 'item_1': values_1, 'item_2': values_2})

# Dict for converting categories to bar chart heights
cat_to_bar = {'Low': 1, 'Medium': 2, 'High': 3}

# Reencode categorical values as numeric
df[['item_1', 'item_2']] = df[['item_1', 'item_2']].replace(cat_to_bar)
# Use dates as our index
df = df.set_index('dates')
df

[out]

dates   item_1  item_2
2021-01-01  1   3
2021-01-02  3   1
2021-01-02  1   1
2021-01-03  2   3

ax = df.plot(kind='bar')
# Force the y-axis to only have ticks at category heights
ax.set_yticks(list(cat_to_bar.values()))
# change y axis labels from numbers to our category names
ax.set_yticklabels(list(cat_to_bar.keys()))

【讨论】:

  • 谢谢,它成功了。当一个项目的记录多于记录时,有什么方法可以添加标记。例如,对于 1 月 2 日的 item_1,有两条记录一低一高我也想捕获低值,如相关图像所示?
  • 您需要首先决定您希望如何显示该信息。例如,每个条上方的数字/计数,按条的宽度,如果有超过 1 个相同的值会发生什么,例如同一天出现 2 个“低”值。当您清楚要显示的内容时,编写一些代码来做您想做的事情或提出其他问题会更容易。
猜你喜欢
  • 2020-10-13
  • 2017-11-20
  • 1970-01-01
  • 2021-12-27
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 2023-03-26
相关资源
最近更新 更多