【问题标题】:How to scale y-axis for histogram pandas plot?如何缩放直方图熊猫图的 y 轴?
【发布时间】:2022-06-14 01:52:44
【问题描述】:

我有一整年的数据,间隔为 15 分钟,想创建一个统计小时数而不是 15 分钟的直方图。

玩具示例代码

我有以下玩具示例代码

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv(r"D:/tmp/load.csv")
df.hist(bins=range(20,80,5))
sns.set()
plt.xlabel("Value")
plt.ylabel("count")
plt.show()

这会产生以下图表。

DataFrame 中的数据格式为:

>>> df[(df["Time"] > "2021-04-10 19:45:00") & (df["Time"] < "2021-04-10 21:00:00")]
                     Time      tag
9584  2021-04-10 20:00:00  50.3840
9585  2021-04-10 20:15:00  37.8332
9586  2021-04-10 20:30:00  36.6808
9587  2021-04-10 20:45:00  37.1840

预期结果

我需要更改直方图上的 y 轴值,以便查看小时数而不是十五分钟数。所以对于第一列,我应该看到 10 (40/4) 而不是 40。所以整个 y 轴应该除以 4。

问题

如何在直方图中执行 y 轴的缩放? 我应该以某种方式使用plt.yticks 函数吗?

【问题讨论】:

  • 您能提供示例输入文件吗?或者这可以帮助stackoverflow.com/a/30326636/8884381
  • @AmitGupta 我添加了数据示例。你建议的答案不能满足我的需要。该答案进行了缩放,我需要重新调整 y 轴。

标签: python pandas histogram


【解决方案1】:

这是我对你有趣问题的看法。

我不知道在绘制数据框后重新缩放 y 轴的方法,但您可以重新缩放数据框本身。

例如,在以下玩具数据框中,测量间隔为 15 分钟,9 个值包含在 35 和 40 之间:

  • 在 20:00:00 到 20:59:00 之间测量了 4 个值
  • 21:00:00 到 21:59:00 之间有 1 个
  • 22:00:00 到 22:59:00 之间 3 个
  • 1 在 23:00:00 和 23:59:00 之间
import pandas as pd

df = pd.DataFrame(
    {
        "index": [
            "2021-04-10 20:00:00",
            "2021-04-10 20:15:00",
            "2021-04-10 20:30:00",
            "2021-04-10 20:45:00",
            "2021-04-10 21:00:00",
            "2021-04-10 21:15:00",
            "2021-04-10 21:30:00",
            "2021-04-10 21:45:00",
            "2021-04-10 22:00:00",
            "2021-04-11 22:15:00",
            "2021-04-11 22:30:00",
            "2021-04-11 22:45:00",
            "2021-04-11 23:00:00",
            "2021-04-11 23:15:00",
            "2021-04-11 23:30:00",
            "2021-04-11 23:45:00",
        ],
        "tag": [39, 36, 36, 37, 42, 28, 39, 54, 43, 38, 39, 36, 44, 27, 38, 28],
    },
)
df["index"] = pd.to_datetime(df["index"], format="%Y-%m-%d %H:%M:%S")

下面是对应的情节:

df.copy().set_index("index").plot(
    kind="hist", bins=range(20, 80, 5), yticks=range(0, 10), grid=True
)

如果测量是按小时计算的,那么在 35-40 的 bin 中会找到 4 个值:

  • 20:00:00 到 20:59:00 之间有 1 个(而不是 4 个)
  • 21:00:00 到 21:59:00 之间有 1 个
  • 22:00:00 到 22:59:00 之间有 1 个(而不是 3 个)
  • 1 在 23:00:00 和 23:59:00 之间

因此,假设每小时重新缩放数据帧:

  • 为箱、日期和小时分配新列
  • 排序值并删除具有相同 bin、日期和小时的行,只保留第一个重复行
  • 清理和绘图
_ = (
    df.assign(
        bin=pd.cut(df["tag"], bins=range(20, 60, 5)),
        date=df["index"].dt.date,
        hour=df["index"].dt.hour,
    )
    .sort_values(by=["bin", "date", "hour"])
    .drop_duplicates(subset=["bin", "date", "hour"], keep="first")
    .drop(columns=["bin", "date", "hour"])
    .set_index("index")
    .plot(kind="hist", bins=range(20, 80, 5), yticks=range(0, 5), grid=True)
)

哪些输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2015-05-04
    • 2017-08-07
    • 1970-01-01
    相关资源
    最近更新 更多