Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在python中绘制非数值数据(Categorical)_Python 3.x_Dataframe_Matplotlib - Fatal编程技术网

Python 3.x 在python中绘制非数值数据(Categorical)

Python 3.x 在python中绘制非数值数据(Categorical),python-3.x,dataframe,matplotlib,Python 3.x,Dataframe,Matplotlib,我有以下数据帧: 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日的项目_1,酒吧将变低,项目_2将变高。1月2日,项目_1将上升至高位,但也将在低位放置一个标记,因为在同一日期,项目_1还有另一个低位条目。以下是预期结果 我能想到的

我有以下数据帧:

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日的项目_1,酒吧将变低,项目_2将变高。1月2日,项目_1将上升至高位,但也将在低位放置一个标记,因为在同一日期,项目_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、3,并绘制该值,然后更改轴标签。@PerroNoob OP可以这样做,但我尝试了df.plot(x='date',y='item_1',kind='bar'),但得到了TypeError:没有数字数据要绘制。谢谢,它成功了。当一个项目的记录超过个时,是否有任何方法添加标记。例如,对于1月2日的项目_1,有两条记录,一条低,一条高。我也想捕获低值,如所示。您需要首先决定如何显示该信息。例如,根据条的宽度,每个条上方的数字/计数,如果同一天有1个以上的相同值,例如2个“低”值,会发生什么情况。当你清楚你想显示什么的时候,写一些代码来做你想做的事情,或者问另一个问题就容易多了。