【问题标题】:color line of scatter plot on all subplot depending on a column所有子图上散点图的颜色线,取决于列
【发布时间】:2021-08-05 03:32:37
【问题描述】:

python==3.8,情节==4.14.3

MRE:

start_date = "20210716"
end_date = "20210730"

date_range = pd.date_range(start=start_date, end=end_date).strftime("%Y%m%d")
A = np.random.randint(1, 100, size=len(date_range)*2)
B = np.random.randint(1, 100, size=len(date_range)*2)
names = ["albert", "chris"]
C = names*(len(date_range))

df = pd.DataFrame({"date":list(date_range)*2,
                   "A":A,
                   "B":B,
                   "C":C})

df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")
df.set_index(["date"], inplace=True)
df.sort_index(inplace=True)

看起来像这样:

            A   B   C
date         
2021-07-16  48  62  Albert
2021-07-16  23  44  Chris
2021-07-17  7   21  Albert
2021-07-17  5   99  Chris
2021-07-18  9   28  Albert
     ...

我想用以下内容创建一个子图

  1. 以 A 列为 y 轴的散点图
  2. 以 B 列为 y 轴的散点图
  3. 散点图中的每一行都使用 columnC 着色

大多数类似问题的答案都使用 clustered.iplot 或 plotly express。我想坚持plotly.graph_objects

这是我的看法:

colors = ["blue", "yellow"]

fig = make_subplots(rows=2, cols=1)

for i, col in enumerate(["A", "B"]):
    for name, color in zip(names, colors):
        n_df = df.loc[df["C"] == name].copy()
        fig.add_trace(
            go.Scatter(
                name = f"{i}_{name}",
                x = n_df.index,
                y = n_df[col],
                marker_color = color
                
            ),
            row=i+1, col=1
        )
    fig.update_yaxes(title_text=col, row=i+1, col=1)
fig.show()

这可以完成工作,但是随着更多名字的出现,我不想每次都添加新颜色。 有没有更容易维护的方法?

【问题讨论】:

    标签: python pandas plotly


    【解决方案1】:

    最简单的方法是使用内置色标。但是,由于它有 10 种颜色,因此最多可以支持 10 人。如果你需要更多,你可以为 20 个人准备颜色,而不是现在的两个。由于这是一个循环过程,因此只会使用从一开始就需要的人数。在official reference 中查看连续和发散色标。

    import plotly.express as px
    # colors = ["blue", "yellow"]
    colors = px.colors.sequential.Plasma
    # ['#0d0887','#46039f','#7201a8','#9c179e','#bd3786','#d8576b','#ed7953','#fb9f3a','#fdca26','#f0f921']
    

    由于颜色的顺序是连续的,我们需要使用random.sample()对其进行洗牌。

    import random
    colors = random.sample(colors, len(colors))
    

    【讨论】:

    • 这是完美的但是不想使用plotly.express。我所有的代码都使用plotly.graph_object 并希望尽可能保持一致。
    • @haneulkim,plotly 仅用于生成颜色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2021-12-14
    • 2018-04-09
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多