Plotly:如何从 x 轴上删除空日期?
Plotly: How to remove empty dates from x axis?
我有一个数据框
Date Category Sum
0 2019-06-03 "25M" 34
1 2019-06-03 "25M" 60
2 2019-06-03 "50M" 23
3 2019-06-04 "25M" 67
4 2019-06-05 "50M" -90
5 2019-06-05 "50M" 100
6 2019-06-06 "100M" 6
7 2019-06-07 "25M" -100
8 2019-06-08 "100M" 67
9 2019-06-09 "25M" 450
10 2019-06-10 "50M" 600
11 2019-06-11 "25M" -9
12 2019-07-12 "50M" 45
13 2019-07-13 "50M" 67
14 2019-07-14 "100M" 130
15 2019-07-14 "50M" 45
16 2019-07-15 "100M" 100
17 2019-07-16 "25M" -90
18 2019-07-17 "25M" 700
19 2019-07-18 "25M" -9
我想创建一个绘图,显示在每个描述的日期为不同的 "Category" 添加 "Sum",但如果日期没有任何数据,我想删除这些日期。
代码
df["Date"]=pd.to_datetime(df["Date"], format=("%Y%m%d"))
df=df.sort_values(["Date","Category","Sum"],ascending=False)
df=round(df.groupby(["Date","Category"]).agg({"Sum":"sum"}).reset_index(),1)
fig = px.bar(df, x=df["Date"] , y='Sum',barmode="group",color="Category")
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=1, label="day", step="day", stepmode="todate"),
dict(count=24, label="montly", step="month", stepmode="todate"),
dict(count=1, label="year", step="year", stepmode="todate"),
dict(step="all")
])
))
fig.show()
我得到这样的图表,但我想从图表中删除空日期
这个问题是由于将您的 'Date'
巧妙地解释为 日期 并在最旧和最新时间戳之间创建了一个连续的时间段,有效地显示了没有关联的日期数据作为差距。一个解决方案是在日期列中获取第一个和最后一个日期,并制作一个完整该期间日期的列表,然后找出哪些日期不 有任何观察结果,并将其存储在名为 dt_breaks
的变量中。然后,最后,您可以将这些日期包含在:
fig.update_xaxes(
rangebreaks=[dict(values=dt_breaks)] # hide dates with no values
)
这将在您的可视化中删除这些日期,和将 x 值的格式设置为日期,以便您可以使用按钮对数据进行子集化:
正如您所知,这里是没有 rangebreaks=[dict(values=dt_breaks)]
的相同可视化:
为了尽可能简单地完成这项工作,我使用 df=df.sort_values(["Date","Category","Sum"],ascending=True)
重新排列了日期列,而不是像您的原始代码片段中那样 df=df.sort_values(["Date","Category","Sum"],ascending=False)
完整代码:
import pandas as pd
import plotly.express as px
df = pd.DataFrame({'Date': {0: '2019-06-03',
1: '2019-06-03',
2: '2019-06-03',
3: '2019-06-04',
4: '2019-06-05',
5: '2019-06-05',
6: '2019-06-06',
7: '2019-06-07',
8: '2019-06-08',
9: '2019-06-09',
10: '2019-06-10',
11: '2019-06-11',
12: '2019-07-12',
13: '2019-07-13',
14: '2019-07-14',
15: '2019-07-14',
16: '2019-07-15',
17: '2019-07-16',
18: '2019-07-17',
19: '2019-07-18'},
'Category': {0: '"25M"',
1: '"25M"',
2: '"50M"',
3: '"25M"',
4: '"50M"',
5: '"50M"',
6: '"100M"',
7: '"25M"',
8: '"100M"',
9: '"25M"',
10: '"50M"',
11: '"25M"',
12: '"50M"',
13: '"50M"',
14: '"100M"',
15: '"50M"',
16: '"100M"',
17: '"25M"',
18: '"25M"',
19: '"25M"'},
'Sum': {0: 34,
1: 60,
2: 23,
3: 67,
4: -90,
5: 100,
6: 6,
7: -100,
8: 67,
9: 450,
10: 600,
11: -9,
12: 45,
13: 67,
14: 130,
15: 45,
16: 100,
17: -90,
18: 700,
19: -9}})
df["Date"]=pd.to_datetime(df["Date"], format=("%Y-%m-%d"))
df=df.sort_values(["Date","Category","Sum"],ascending=True)
df=round(df.groupby(["Date","Category"]).agg({"Sum":"sum"}).reset_index(),1)
dt_all = pd.date_range(start=df['Date'].iloc[0],end=df['Date'].iloc[-1])
dt_obs = [d.strftime("%Y-%m-%d") for d in df['Date']]
dt_breaks = [d for d in dt_all.strftime("%Y-%m-%d").tolist() if not d in dt_obs]
df=df.set_index('Date')
#fig = px.bar(df, x=df.index.strftime("%Y/%m/%d") , y='Sum',barmode="group",color="Category")
fig = px.bar(df, x=df.index , y='Sum',barmode="group",color="Category")
fig.update_xaxes(
rangebreaks=[dict(values=dt_breaks)] # hide dates with no values
)
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=1, label="day", step="day", stepmode="todate"),
dict(count=24, label="montly", step="month", stepmode="todate"),
dict(count=1, label="year", step="year", stepmode="todate"),
dict(step="all")
])
))
fig.show()
我的图表也有同样的问题。只需将以下内容添加到布局代码中:
xaxis=dict(type = "category")
注:我用过import plotly.graph_objs as go
不是 import plotly.express as px
这对我有用。希望对你也有帮助。
万一有人在这里玩股票数据,下面是使用范围突破隐藏交易时间和周末之外的代码。
fig = go.Figure(data=[go.Candlestick(x=df['date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
fig.update_xaxes(
rangeslider_visible=True,
rangebreaks=[
# NOTE: Below values are bound (not single values), ie. hide x to y
dict(bounds=["sat", "mon"]), # hide weekends, eg. hide sat to before mon
dict(bounds=[16, 9.5], pattern="hour"), # hide hours outside of 9.30am-4pm
# dict(values=["2020-12-25", "2021-01-01"]) # hide holidays (Christmas and New Year's, etc)
]
)
fig.update_layout(
title='Stock Analysis',
yaxis_title=f'{symbol} Stock'
)
fig.show()
这里是Plotly's doc。
要跳过空的日期、时间,您应该使用:
import plotly.graph_objects as go
fig.add_trace(go.Candlestick(x=df['begin'], ...)
fig.layout = dict(title=ticker, xaxis = dict(type="category", categoryorder='category ascending'))
fig.show()
这个例子效果很好。
祝你好运
想添加到 Mega J 的回答中。首先获取您日期范围内的市场假期列表,如下所示:
xnys = xcals.get_calendar("XNYS", start=import_start, end=import_end)
holidays = pd.to_datetime(xnys.day.holidays)
holiday_mask= (holidays > import_start) & (holidays <= import_end)
hols = holidays[holiday_mask].strftime("%Y-%m-%d").tolist()
从上面复制 Mega J 的代码并将假期添加到 rangebreak:
fig = go.Figure(data=[go.Candlestick(x=df['date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
fig.update_xaxes(
rangeslider_visible=True,
rangebreaks=[
# NOTE: Below values are bound (not single values), ie. hide x to y
dict(bounds=["sat", "mon"]), # hide weekends, eg. hide sat to before mon
dict(bounds=[16, 9.5], pattern="hour"), # hide hours outside of 9.30am-4pm
dict(values=hols) # hide market holidays inside your date range
]
)
fig.update_layout(
title='Stock Analysis',
yaxis_title=f'{symbol} Stock'
)
fig.show()
我有一个数据框
Date Category Sum
0 2019-06-03 "25M" 34
1 2019-06-03 "25M" 60
2 2019-06-03 "50M" 23
3 2019-06-04 "25M" 67
4 2019-06-05 "50M" -90
5 2019-06-05 "50M" 100
6 2019-06-06 "100M" 6
7 2019-06-07 "25M" -100
8 2019-06-08 "100M" 67
9 2019-06-09 "25M" 450
10 2019-06-10 "50M" 600
11 2019-06-11 "25M" -9
12 2019-07-12 "50M" 45
13 2019-07-13 "50M" 67
14 2019-07-14 "100M" 130
15 2019-07-14 "50M" 45
16 2019-07-15 "100M" 100
17 2019-07-16 "25M" -90
18 2019-07-17 "25M" 700
19 2019-07-18 "25M" -9
我想创建一个绘图,显示在每个描述的日期为不同的 "Category" 添加 "Sum",但如果日期没有任何数据,我想删除这些日期。
代码
df["Date"]=pd.to_datetime(df["Date"], format=("%Y%m%d"))
df=df.sort_values(["Date","Category","Sum"],ascending=False)
df=round(df.groupby(["Date","Category"]).agg({"Sum":"sum"}).reset_index(),1)
fig = px.bar(df, x=df["Date"] , y='Sum',barmode="group",color="Category")
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=1, label="day", step="day", stepmode="todate"),
dict(count=24, label="montly", step="month", stepmode="todate"),
dict(count=1, label="year", step="year", stepmode="todate"),
dict(step="all")
])
))
fig.show()
我得到这样的图表,但我想从图表中删除空日期
这个问题是由于将您的 'Date'
巧妙地解释为 日期 并在最旧和最新时间戳之间创建了一个连续的时间段,有效地显示了没有关联的日期数据作为差距。一个解决方案是在日期列中获取第一个和最后一个日期,并制作一个完整该期间日期的列表,然后找出哪些日期不 有任何观察结果,并将其存储在名为 dt_breaks
的变量中。然后,最后,您可以将这些日期包含在:
fig.update_xaxes(
rangebreaks=[dict(values=dt_breaks)] # hide dates with no values
)
这将在您的可视化中删除这些日期,和将 x 值的格式设置为日期,以便您可以使用按钮对数据进行子集化:
正如您所知,这里是没有 rangebreaks=[dict(values=dt_breaks)]
的相同可视化:
为了尽可能简单地完成这项工作,我使用 df=df.sort_values(["Date","Category","Sum"],ascending=True)
重新排列了日期列,而不是像您的原始代码片段中那样 df=df.sort_values(["Date","Category","Sum"],ascending=False)
完整代码:
import pandas as pd
import plotly.express as px
df = pd.DataFrame({'Date': {0: '2019-06-03',
1: '2019-06-03',
2: '2019-06-03',
3: '2019-06-04',
4: '2019-06-05',
5: '2019-06-05',
6: '2019-06-06',
7: '2019-06-07',
8: '2019-06-08',
9: '2019-06-09',
10: '2019-06-10',
11: '2019-06-11',
12: '2019-07-12',
13: '2019-07-13',
14: '2019-07-14',
15: '2019-07-14',
16: '2019-07-15',
17: '2019-07-16',
18: '2019-07-17',
19: '2019-07-18'},
'Category': {0: '"25M"',
1: '"25M"',
2: '"50M"',
3: '"25M"',
4: '"50M"',
5: '"50M"',
6: '"100M"',
7: '"25M"',
8: '"100M"',
9: '"25M"',
10: '"50M"',
11: '"25M"',
12: '"50M"',
13: '"50M"',
14: '"100M"',
15: '"50M"',
16: '"100M"',
17: '"25M"',
18: '"25M"',
19: '"25M"'},
'Sum': {0: 34,
1: 60,
2: 23,
3: 67,
4: -90,
5: 100,
6: 6,
7: -100,
8: 67,
9: 450,
10: 600,
11: -9,
12: 45,
13: 67,
14: 130,
15: 45,
16: 100,
17: -90,
18: 700,
19: -9}})
df["Date"]=pd.to_datetime(df["Date"], format=("%Y-%m-%d"))
df=df.sort_values(["Date","Category","Sum"],ascending=True)
df=round(df.groupby(["Date","Category"]).agg({"Sum":"sum"}).reset_index(),1)
dt_all = pd.date_range(start=df['Date'].iloc[0],end=df['Date'].iloc[-1])
dt_obs = [d.strftime("%Y-%m-%d") for d in df['Date']]
dt_breaks = [d for d in dt_all.strftime("%Y-%m-%d").tolist() if not d in dt_obs]
df=df.set_index('Date')
#fig = px.bar(df, x=df.index.strftime("%Y/%m/%d") , y='Sum',barmode="group",color="Category")
fig = px.bar(df, x=df.index , y='Sum',barmode="group",color="Category")
fig.update_xaxes(
rangebreaks=[dict(values=dt_breaks)] # hide dates with no values
)
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=1, label="day", step="day", stepmode="todate"),
dict(count=24, label="montly", step="month", stepmode="todate"),
dict(count=1, label="year", step="year", stepmode="todate"),
dict(step="all")
])
))
fig.show()
我的图表也有同样的问题。只需将以下内容添加到布局代码中:
xaxis=dict(type = "category")
注:我用过import plotly.graph_objs as go
不是 import plotly.express as px
这对我有用。希望对你也有帮助。
万一有人在这里玩股票数据,下面是使用范围突破隐藏交易时间和周末之外的代码。
fig = go.Figure(data=[go.Candlestick(x=df['date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
fig.update_xaxes(
rangeslider_visible=True,
rangebreaks=[
# NOTE: Below values are bound (not single values), ie. hide x to y
dict(bounds=["sat", "mon"]), # hide weekends, eg. hide sat to before mon
dict(bounds=[16, 9.5], pattern="hour"), # hide hours outside of 9.30am-4pm
# dict(values=["2020-12-25", "2021-01-01"]) # hide holidays (Christmas and New Year's, etc)
]
)
fig.update_layout(
title='Stock Analysis',
yaxis_title=f'{symbol} Stock'
)
fig.show()
这里是Plotly's doc。
要跳过空的日期、时间,您应该使用:
import plotly.graph_objects as go
fig.add_trace(go.Candlestick(x=df['begin'], ...)
fig.layout = dict(title=ticker, xaxis = dict(type="category", categoryorder='category ascending'))
fig.show()
这个例子效果很好。 祝你好运
想添加到 Mega J 的回答中。首先获取您日期范围内的市场假期列表,如下所示:
xnys = xcals.get_calendar("XNYS", start=import_start, end=import_end)
holidays = pd.to_datetime(xnys.day.holidays)
holiday_mask= (holidays > import_start) & (holidays <= import_end)
hols = holidays[holiday_mask].strftime("%Y-%m-%d").tolist()
从上面复制 Mega J 的代码并将假期添加到 rangebreak:
fig = go.Figure(data=[go.Candlestick(x=df['date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
fig.update_xaxes(
rangeslider_visible=True,
rangebreaks=[
# NOTE: Below values are bound (not single values), ie. hide x to y
dict(bounds=["sat", "mon"]), # hide weekends, eg. hide sat to before mon
dict(bounds=[16, 9.5], pattern="hour"), # hide hours outside of 9.30am-4pm
dict(values=hols) # hide market holidays inside your date range
]
)
fig.update_layout(
title='Stock Analysis',
yaxis_title=f'{symbol} Stock'
)
fig.show()