【问题标题】:Python pandas and plotly. Having trouble with dates and displayPython 熊猫和情节。日期和显示有问题
【发布时间】:2020-06-16 21:28:27
【问题描述】:

对不起,我是 plotly 的新手。
我有一个清晰的 pd.DataFrame,其中包含按顺序排列的日期。

初始日期采用以下格式:YYYYMMDD。
当我尝试转换它时,plotly 会将日期显示为我只能描述为随机数(在悬停文本中)。经过大量搜索后,我发现我的解决方法(参见代码)是唯一的解决方案。

但真正的问题是:如您所见,每个月都有不同数量的条目。当我放弃这一天时,将一个月的所有条目放在同一个位置。
当我使用 x=df.index 时,我得到了最好的结果,但我没有日期的可视化。 我想要的是每个条目之间有均匀的间隔,并有一个清晰的视觉提示,显示哪个条目属于哪个月份。
我将在帖子末尾附加一张图片以更好地解释我的问题(英语不是我的第一语言..)

代码:

import pandas as pd
import plotly.express as px

columns = ["date", "farts"]
df = pd.read_csv('test.csv', sep=',', engine='python', names=columns)

# Using a smaller made up csv file for testing. It looks like this:
# 20200119, 50
# 20200115, 40
# 20200105, 30
# 20191215, 40
# 20191120, 35
# 20191115, 12

print(df)

df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")

df["date"] = df["date"].dt.strftime('%Y-%m')

print(df)

#works very well so far:

# before:

#        date  farts
# 0  20200119     50
# 1  20200115     40
# 2  20200105     30
# 3  20191215     40
# 4  20191120     35
# 5  20191115     12

# after:

#       date  farts
# 0  2020/01     50
# 1  2020/01     40
# 2  2020/01     30
# 3  2019/12     40
# 4  2019/11     35
# 5  2019/11     12

fig = px.bar(df, x="date", y='farts', width=1000, height=350)
fig.show()

你们有什么想法我可以做些什么来获得更好看的图表吗?

图片帮助理解: https://i.imgur.com/3Vi9xFi.png

编辑:尝试了一下,我越来越沮丧。要么不显示,要么日期反转,等等......

如果我选择 df["date"],我无法停止将同一个月的条目集中到一个地方。
如果我使用 df.index,我似乎无法根据日期列命名 x 轴条目。

【问题讨论】:

  • 如果在图表前执行pd.set_index('date') 会发生什么?

标签: python pandas plotly


【解决方案1】:

IIUC 你可以绘制然后更新 xtick 名称的布局。

import pandas as pd
import plotly.graph_objs as go
import plotly.express as px

from io import StringIO

df = """date,farts
20200119, 50
20200115, 40
20200105, 30
20191215, 40
20191120, 35
20191115, 12"""

df = pd.read_csv(StringIO(df))

df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")\
               .dt.strftime('%Y-%m')
df = df.sort_values("date").reset_index(drop=True)

plotly.graph_objs

fig =  go.Figure()
fig.add_trace(go.Bar(x=df.index,y=df["farts"]))
fig.update_layout(
    xaxis = dict(
        tickmode = 'array',
        tickvals = df.index,
        ticktext = df["date"]
    )
)
fig.show()

plotly.express

px.bar(df,x=df.index,y="farts")
fig.update_layout(
    xaxis = dict(
        tickmode = 'array',
        tickvals = df.index,
        ticktext = df["date"]
    )
)

输出是一样的

【讨论】:

    【解决方案2】:

    根据您的需要,您有 2 个选项

    首先让我们为示例创建数据:

    data = [
        ["20200119", 50],
        ["20200115", 40],
        ["20200105", 30],
        ["20191215", 40],
        ["20191120", 35],
        ["20191115", 12],
    ]
    

    1。绘制为类别

    默认情况下,plotly 会将日期设置为日期,您可以使用以下命令覆盖它:

    df = pd.DataFrame(data, columns=["date", "farts"])
    df["date"] = "D" + df["date"] # Add a string so that plotly won't transform to date
    
    fig = px.bar(df, x="date", y='farts')
    

    2。每月重新采样

    如果你想绘制每月的日期,你应该避免重复。为此,您可以重新采样并对每个月的所有条目进行mean 或sum:

    df = pd.DataFrame(data, columns=["date", "farts"])
    df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")
    df = df.resample('MS', on='date').mean() # You should not have duplicates
    df = df.reset_index() # You need date as a column with plotly express
    
    fig = px.bar(df, x="date", y='farts')
    

    【讨论】:

    • 感谢您的回答。 1.不起作用,“D”行给出错误。 2. 不是一个好的解决方案,因为我想将每个条目分开。
    • 那是因为您使用的是pd.to_datetime,而您不应该这样做。我已经编辑了答案以使其更清楚。
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 2017-01-13
    • 2021-02-17
    • 2021-11-12
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多