【问题标题】:Plotly - How to add count of rows to Y axis on line chart?Plotly - 如何在折线图的 Y 轴上添加行数?
【发布时间】:2021-01-12 00:22:23
【问题描述】:

我正在尝试创建一个简单的折线图,其中 X 轴为日期字段,Y 轴为行数。我正在使用以下代码:

import plotly.express as px

data = {'Project':  ['Project 1', 'Project 2', ' Project 3', 'Project 4', 'Project 5', 'Project 6', 'Project 7', 'Project 8', 'Project 9', 'Project 10'],
        'Date': ['10/1/2020', '10/1/2020', '11/1/2020', '12/1/2020', '12/1/2020', '12/1/2020', '2/1/2021', '2/1/2021', '3/1/2021', '4/1/2021']}

df2 = pd.DataFrame(data, columns = ['Project','Date'])

fig = px.line(df2, x= "Date", y = "Project", title='<b>Project</b>')
fig.show()

但是当我这样做时,项目名称在 X 轴上,而不是每个日期的项目数。

有谁知道我如何添加行数,以便在折线图上显示日期每个月的项目数?

【问题讨论】:

  • 尝试 df.groupby('Start_Date').size().plot() 然后 plt.show()... 始终提供示例数据,以便答案可以在相同的数据集上工作并获得可比较的结果,但是如果采用这种方法,您甚至可能会得到一个复制粘贴的答案你很幸运
  • 因此,虽然这适用于 matlib 图,但它导致了一个空白的 Plotly 折线图。如果我使用类似 df['New_Column'] = len(df.Project.unique()) 的东西,它会导致每个日期的总计数(36),所以它是一条直线,而不是计算每个日期的唯一项目。我正在使用工作数据,所以我将尝试模拟一些东西作为示例使用
  • 好的,我刚刚使用一些示例数据编辑了原始帖子来演示我的问题

标签: python plotly plotly-python


【解决方案1】:

在发送到 plotly 之前,您需要 groupbycount pandas 中的行。此外,您的示例没有显示它,但如果您希望在同一个月内有不同的日期并且您只关心年/月,那么您需要在分组之前应用一些舍入(或从日期中提取年和月 @987654326 @ 和 data['Date'].dt.month,随你喜欢)。

取这个略有不同的样本,其中有 10/2 投入其中

import plotly.express as px

data = {'Project':  ['Project 1', 'Project 2', ' Project 3', 'Project 4', 'Project 5', 'Project 6', 'Project 7', 'Project 8', 'Project 9', 'Project 10'],
        'Date': ['10/1/2020', '10/2/2020', '11/1/2020', '12/1/2020', '12/2/2020', '12/1/2020', '2/1/2021', '2/1/2021', '3/1/2021', '4/1/2021']}

df2 = pd.DataFrame(data, columns = ['Project','Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

df_grouped = (
    df2.groupby(
        # normalize all dates to start of month
        df2['Date'].astype('datetime64[M]')
    )['Project'].count().rename('Count').to_frame()
)
df_grouped['Names'] = (
    df2.groupby(df2['Date'].astype('datetime64[M]')
    )['Project'].agg(',<br>    '.join)
)

print(df_grouped)

fig = px.line(
    df_grouped, y='Count', title='<b>Projects per month</b>',
    hover_data=['Names']
)
fig.write_html('fig1.html', auto_open=True)

更新:根据要求,此新代码在悬停时显示项目名称。

输出

            Count                                          Names
Date
2020-10-01      2                    Project 1,<br>    Project 2
2020-11-01      1                                      Project 3
2020-12-01      3  Project 4,<br>    Project 5,<br>    Project 6
2021-02-01      2                    Project 7,<br>    Project 8
2021-03-01      1                                      Project 9
2021-04-01      1                                     Project 10

【讨论】:

  • 嗨!我有一个后续问题。我想在悬停时添加项目的名称。为此,我添加了以下内容:hovertext = 'Project: ' + df2['Project]' 但当我这样做时,即使该月有多个项目,悬停也只会显示任何数据点上的第一个项目。你知道如何让多个项目在一个月内悬停显示吗?
  • 所以当我使用你的新代码时,我收到以下错误:cannot astype a datetimelike from [datetime64[ns]] to [datetime64[M]] 你知道为什么会这样吗?将 Date 转换为 datetime64[M] 时,原始代码运行良好。
  • 这很奇怪,因为它在我的腿上运行良好...尝试升级 pandas 或更改代码,如this answer
【解决方案2】:

您可以通过Matplotlib's hist轻松实现这一目标

例子:

from datetime import datetime
import matplotlib
import pandas as pd
from matplotlib.pyplot import hist

df = pd.DataFrame(
    {'a': [1, 2, 3, 4]}, 
    index=[datetime(2020, 9, 24), 
           datetime(2020, 9, 24), 
           datetime(2020, 9, 24), 
           datetime(2020, 9, 25)]
)

hist(df.index)

不是最漂亮的直方图,但我相信您可以从这里根据需要对其进行调整;)

【讨论】:

  • 这是一个 matplotlib 对一个情节问题的回答。
  • @vestland 我相信这个问题在以前的编辑中根本没有提到情节
  • @RichieV 有标签。而px.line 表示plotly.express.line
  • @vestland 他一开始没有提到 Plotly。我相信 RichieV 的答案是 OP 无论如何都在寻找的。我将把它留在这里作为替代
  • @LucasAbbade 当然可以!没有规则反对这一点。我相信最初的问题被标记为 only python 和 plotly 。但是很高兴看到在 matplotlib 中也可以完成一些事情。只要对带有情节标签的问题也有情节答案。并且经常发生我只看到 matplotlib 对情节问题的答案,这可能部分是因为许多用户往往倾向于只仔细查看具有 zero 答案的问题。所以我发现在“错误”标签下发布答案有时会阻止“真实”答案的出现。但现在就足够了......