微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Plotly中分割数据框并使用不同的线型进行绘图

如何解决在Plotly中分割数据框并使用不同的线型进行绘图

我不熟悉Plotty和Pandas,我试图找到一个优雅的解决方案,因为我认为我要么没有有效地在Plotby中使用groupby,要么我的数据以某种方式堆积了,这使我无法看到它。

要制作测试图,我使用了一个伪造的数据集,方法是将3个列表(组,月,支出)压缩在一起,并在特定月份(3月20日)之后将其分为“实际”和“预测”值。 / p>

当我试图添加一个预测df的踪迹时,它包含了几个月内的3个不同的组。

An attempt at using trace for all three groups

当我将索引更改为组,然后使用loc将其分为3个独立的集合(每个组一个)时,尽管感觉像是一个科学怪人的解决方案,我还是成功制作了以下图表:

Using three separate traces

我想知道是否有一种方法可以绘制出初始数据框的图表并在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()

结果:

Imgur

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?