如何随着时间的推移可视化定量或定性的数据,但绝不是两者兼而有之?

How to visualize through time a data that is quantitative or qualitative, but never both?

我有一个 csv 文件,其中有些行有文字,有些行有数字。像 :

         column1   column2  column3 
date      2019      2020      2021
color     blue      blue     yellow
velocity    1        22        3 
power       4        2         1 

而且我需要在图表中将其可视化,使我能够直观地搜索所有属性(颜色、速度、功率)在时间段内的模式。但所有情节 plots 我发现只允许我单独跟踪定量或定性值,而不是一起跟踪。 我什至无法在脑海中想象一个情节必须如何才能允许这样......我能想到的唯一方法是将每个定性值转置到一个新行,并向其添加一个任意常数,比如:

       column1   column2  column3 
date      2019      2020      2021
blue       100       100       0  
yellow      0        0        100
velocity    1        22        3 
power       4        2         1 

因此,例如,在折线图中,顶部会有一条直线指示正在发生的定性值,而所有其他直线都位于底部。我想它可以根据行索引(日期、颜色、速度、功率)着色,让我可以直观地识别它。但我很确定有更好的方法。

任何绘图库都可以接受,虽然 plotly 是首选,因为它很容易。

  • 您提供的数据是四个因素。所以你可以使用 scatter for x,y,size & color
  • color 是定性的明显选择。其他人也可以通过使用分类数据类型来定性。
import io
import pandas as pd
import plotly.express as px

df = pd.read_csv(io.StringIO("""         column1   column2  column3 
date      2019      2020      2021
color     blue      blue     yellow
velocity    1        22        3 
power       4        2         1  """), sep="\s+").T

df["date"] = df["date"].astype(int)
df["velocity"] = df["velocity"].astype(int)
df["power"] = df["power"].astype(int)

fig = px.scatter(df, x="date", y="velocity", color="color", size="power")
fig.update_layout(xaxis={"tickformat":"d"})

标准 px.scatter(df, x="date", y="velocity", color="color", size="power") 似乎工作正常。但是,如果您的设置不仅代表更复杂的现实世界案例,我建议稍微调整一下,以便图例中的名称不会 say 'yellow' 而是 display 'red',这正是将要发生的事情,因为 px.scatter(color ='color') 中的 color 实际上并没有 assign颜色,而是 对应的分类变量。我怀疑同时显示 命名图例中的颜色有点多余。不管怎样,我希望你会发现这个有用:

fig.for_each_trace(lambda t: t.update(marker_color = t.name, name=''))

完整代码:

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'date': {'column1': 2019, 'column2': 2020, 'column3': 2021},
                     'color': {'column1': 'blue', 'column2': 'blue', 'column3': 'yellow'},
                     'velocity': {'column1': 1, 'column2': 22, 'column3': 3},
                     'power': {'column1': 4, 'column2': 2, 'column3': 1}})

fig = px.scatter(df, x="date", y="velocity", color="color", size="power")
f = fig.full_figure_for_development(warn=False)

fig.for_each_trace(lambda t: t.update(marker_color = t.name, name=''))

fig.show()