如何解决在Plotly中分割数据框并使用不同的线型进行绘图
我不熟悉Plotty和Pandas,我试图找到一个优雅的解决方案,因为我认为我要么没有有效地在Plotby中使用groupby,要么我的数据以某种方式堆积了,这使我无法看到它。
要制作测试图,我使用了一个伪造的数据集,方法是将3个列表(组,月,支出)压缩在一起,并在特定月份(3月20日)之后将其分为“实际”和“预测”值。 / p>
当我试图添加一个预测df的踪迹时,它包含了几个月内的3个不同的组。
当我将索引更改为组,然后使用loc将其分为3个独立的集合(每个组一个)时,尽管感觉像是一个科学怪人的解决方案,我还是成功制作了以下图表:
我想知道是否有一种方法可以绘制出初始数据框的图表并在x轴上的某个点之后更改线型,如果没有,是否可以使用一种方法来跟踪包含三个不同组(组1,组2,组3)的数据?我不确定是否使用三个单独的跟踪并一遍又一遍地拆分数据是否是最佳解决方案,并且我相信有一个更有效的解决方案。
这是我目前如何获得单独分组的方式:
# reset index
forecast = forecast.set_index(['group'])
#split
group1_forecast =forecast.loc['group1']
group2_forecast = forecast.loc['group2']
group3_forecast = forecast.loc['group3']
这是带有单独轨迹的图表的(最小)代码:
fig = None
fig = px.line(actual,x="month",y="spend",color='group',title=title)
# group1
fig.add_scatter(
x= group1_forecast.month,y = group1_forecast.spend,mode = 'lines',line = dict(shape = 'linear',color = 'purple',width = 1,dash = 'dot'),connectgaps = True
)
# group2 trace
fig.add_scatter(
x= group2_forecast.month,y = group2_forecast.spend,color = '#33C1FF',connectgaps = True
)
# group3 trace
fig.add_scatter(
x= group3_forecast.month,y = group3_forecast.spend,color = '#FFDD33',connectgaps = True
)
fig.show()
以下是数据:
months = ["Mar '19","Mar '19","Apr '19","May '19","Jun '19","Jul '19","Aug '19","Sep '19","Oct '19","Nov '19","Dec '19","Jan '20","Feb '20","Mar '20","Apr '20","May '20","Jun '20","Jul '20","Aug '20","Sep '20","Sep '20"]
groups = ['group1','group2','group3','group1','group3']
spend = [57,150,75,61.5,156,78,66,63,162,81,69,163.5,81.75,76.5,168,84,79.5,87,169.5,84.75,93,171,85.5,96,97.5,97.9,167.7,84.5,98.4,167.9,85.1,99.9,168.1,85.7,100.9,86.1,101.6,168.4,86.3,102.7,168.8,86.9]
spend_by_group_list = list(zip(months,groups,spend))
spend_df = pd.DataFrame(spend_by_group_list,columns = ['month','group','spend'])
解决方法
创建spend_df
之后,我重新实现了您的数据处理步骤。我不确定您问题的根本原因是100%,因为您没有提供确切的代码来重现该问题。但是,如果您像这样spend_df[spend_df["group"] == "groupN"]
划分组,应该没有问题。几个月的顺序应该保留。
# use spend_df created by your code
# split the different groups
split_month = 13
ls_actual = [] # by group
ls_forecast = [] # by group
for i in range(3):
df = spend_df[spend_df["group"] == f"group{i+1}"]
ls_actual.append(df[:split_month])
ls_forecast.append(df[split_month:])
actual = pd.concat(ls_actual,axis=0) # stack vertically
# plot
import plotly.express as px
import plotly.io as pio
pio.renderers.default = "browser"
# actual
ls_colors = ['purple','#33C1FF','#FFDD33']
fig = px.line(
actual,x="month",y="spend",color='group',color_discrete_map={f"group{i+1}": ls_colors[i] for i in range(3)},title="title"
)
# forecast
for i in range(3):
fig.add_scatter(
x=ls_forecast[i].month,y=ls_forecast[i].spend,mode='lines',line=dict(shape='linear',color=ls_colors[i],width=1,dash='dot'),connectgaps=True
)
fig.show()
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。