【问题标题】:Plotting graph using pandas dataframe for multiple columns使用 pandas 数据框为多列绘制图形
【发布时间】:2021-07-06 04:03:53
【问题描述】:

我有一个名为“file.csv”的 csv 文件

,DATE,DAY,OPEN,2PM,CLOSE,STATUS
0,2021-05-18,Tuesday,538.8,530.45,530.8,0
1,2021-05-19,Wednesday,530.65,532.6,536.85,0
2,2021-05-20,Thursday,536.95,537.05,536.35,1
3,2021-05-21,Friday,538.0,538.2,537.55,1
4,2021-05-24,Monday,537.3,535.05,532.85,1
5,2021-05-25,Tuesday,535.9,531.35,529.65,1
6,2021-05-26,Wednesday,532.95,530.55,532.1,0
7,2021-05-27,Thursday,532.95,529.65,529.85,0

我正在使用 pandas 将其转换为 df。

import pandas as pd
df = pd.read_csv("file.csv")

df输出可以看成

有一个包含 1 和 0 值的“STATUS”列。

我想用 STATUS 列的值(即 0 或 1)从图表上的 DAY 列绘制星期一到星期五。我想看看每天有多少百分比的 0 或 1。

我不知道如何使用这两列来绘制这样的图表。

感谢任何帮助。

【问题讨论】:

  • 你到底想画什么
  • 你是什么意思“图表上提到的 1/0 状态的概率”?情节的目标是不清楚你想可视化什么信息?
  • @Hemesh:状态列有 0 和 1 值。我想将它们绘制成天列
  • @Henry Ecker:我想绘制饼图或任何可以显示天数列和状态列不同关系的图表
  • 这是一个非常广泛的问题。有许多可视化可以显示两列之间的关系。什么样的饼图?一个给0,一个给1??再一次,你想可视化什么信息?您希望情节展示什么?

标签: python python-3.x pandas matplotlib


【解决方案1】:

IIUC,你想要这样的东西吗:

df.groupby('DAY')['STATUS'].value_counts(normalize=True).unstack().plot.bar()

输出:

饼图:

df.groupby('DAY')['STATUS'].value_counts(normalize=True).unstack(0).plot.pie(subplots=True, figsize=(15,8))

输出:

【讨论】:

  • 如果 OP 想重新排序,添加类似.reindex(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
  • 我们可以用 DAYS 和 STATUS 绘制饼图吗?
  • 饼图通常跟踪一个指标。每天 5 个带有状态的饼图?
  • @Scott Boston:啊哈以及如何在情节中保留 csv 文件名?
  • 为绘图添加注释。
【解决方案2】:

要以饼图形式绘制STATUSDAY,一个想法是nested pie chart,例如:

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
g = df.groupby('DAY')['STATUS'].value_counts().unstack().fillna(0).reindex(days)

# STATUS       0    1
# DAY                
# Monday     0.0  1.0
# Tuesday    1.0  1.0
# Wednesday  2.0  0.0
# Thursday   0.0  1.0
# Friday     0.0  1.0
# outer ring (DAY)
size = 0.2
plt.pie(g.sum(axis=1), radius=1,
        startangle=90, counterclock=False,
        wedgeprops=dict(width=size, edgecolor='w'),
        labels=g.index)

# inner ring (STATUS)
values = g.values.ravel()
status = g.columns.tolist() * len(g)
colors = ['#999', '#333'] * len(g)
plt.pie(values, radius=1 - size, colors=colors,
        startangle=90, counterclock=False,
        wedgeprops=dict(width=size, edgecolor='w'),
        labels=[status[i] if values[i] else '' for i in range(len(values))],
        labeldistance=0.6)

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2016-01-11
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多