对不起,我是新来的。
我有一个清晰的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轴条目。
答案 0 :(得分:0)
您有2种选择,具体取决于您想要的东西
首先让我们为示例创建数据:
data = [
["20200119", 50],
["20200115", 40],
["20200105", 30],
["20191215", 40],
["20191120", 35],
["20191115", 12],
]
默认情况下,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')
如果要绘制每月日期,则应避免重复。为此,您可以对每个月的所有条目进行重新采样并进行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 :(得分:0)
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"]
)
)