为啥 go.Scatter 打印额外的行而 px.line 不是?

Posted

技术标签:

【中文标题】为啥 go.Scatter 打印额外的行而 px.line 不是?【英文标题】:Why is go.Scatter printing extra lines whereas px.line is not?为什么 go.Scatter 打印额外的行而 px.line 不是? 【发布时间】:2021-06-27 18:34:11 【问题描述】:

这是我的 graph_objects 代码-

go.Figure(go.Scatter(x=continent_df.date, y=continent_df.new_cases_smoothed))

而我的 plotly express 代码是这样的 -

px.line(continent_df, x='date', y='new_cases_smoothed', color='continent')

为什么第一张图会为每个大陆打印额外的直线?我已经尝试对数据框进行排序。

continent_df.sort_values(['continent','date'], inplace=True)

(另外,如何像在第二张图中那样对第一张图中的每一行进行颜色编码?)

【问题讨论】:

【参考方案1】:

如果没有适当的数据样本,我无法 100% 确定。但您的数据集似乎是一个长格式,continent_df.new_cases_smoothed 中有多个值属于不同的客户。您正在使用 go.Figure(go.Scatter(x=continent_df.date, y=continent_df.new_cases_smoothed)) 将所有这些值分配给单个跟踪。

直线之所以存在,是因为只有一条线来回穿梭,涵盖所有类别和所有索引。当它回到开头并开始显示新类别时,会出现直线的直线部分

但是,在这里使用px.line 可以通过使用color='continent' 对大陆进行分组来解决这个问题。因此,使值类别显示为唯一的痕迹。

我们可以使用 gapminder 数据集(其结构类似于您的真实数据)来说明如何使用 fig.add_traces(go.Scatter()) 将单个跟踪分配给 go.Figure。关键是检索唯一的类别,对数据进行子集化,并逐行添加组。与使用 px.line 相比,这无疑为您提供了更大的灵活性。

情节

代码

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

# Data
gap = px.data.gapminder()

fig = go.Figure()
for c in gap['country'].unique()[:10]:
    df = gap[gap['country']==c]
    fig.add_traces(go.Scatter(x=df['year'], y = df['lifeExp'], name = c))
    
fig.show()

【讨论】:

啊!这很有意义。说明为什么情节表达是一种祝福(直到你必须做子情节)

以上是关于为啥 go.Scatter 打印额外的行而 px.line 不是?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Cordova WebView 有 20px 的额外滚动?

为啥我的 <a> 元素下会出现 4px 的额外填充?

将字符串打印到文件,为啥需要额外的位?

为啥这个命名管道不打印发送的行?

在 vim 中查找第一个未注释的行而不删除搜索

为啥我的 Python 代码在从文本文件中读取时会打印额外的字符“”?