如何摆脱情节线图中的潦草线条?

Posted

技术标签:

【中文标题】如何摆脱情节线图中的潦草线条?【英文标题】:How to get rid of scribbled lines in plotly line plot? 【发布时间】:2021-12-02 02:36:35 【问题描述】:

我正在尝试使用 plotly 绘制一个子图,其中我有一些线图,并且子图中的所有图都需要共享相同的 x 轴,如图所示。

fig = make_subplots(
    rows=5, 
    cols=1, 
    vertical_spacing=0.05,
    subplot_titles=['Count / Anzahl', 'min_nValue', 'max_nValue', 'avg_nValue', 'sum_nValue'],
    shared_xaxes=True,
)
fig.append_trace(go.Scatter(
    x=df_dict_nValueAgg['Erste_15_Minuten']['KurzName'],
    y=df_dict_nValueAgg['Erste_15_Minuten']['min_nValueNorm'],
    name = "min_nValue_" + "Erste_15_Minuten",
    mode='lines+markers',
    #legendgroup = 2
), row=2, col=1)

fig.append_trace(go.Scatter(
    x=df_dict_nValueAgg['Erste_15_Minuten']['KurzName'],
    y=df_dict_nValueAgg['Erste_15_Minuten']['max_nValueNorm'],
    name = "max_nValue_" + "Erste_15_Minuten",
    mode='lines+markers',
    #legendgroup = 2
), row=2, col=1)
.
.
.
# couple of plots more
.
.
fig.update_layout(
    legend_orientation="v", 
    height=1000, 
    width=2000,  
    title_text=currentEventTitle+pastEventTitle+nAttributes,
)
fig.update_xaxes(tickangle=45)
fig.write_image('fig1.png')
fig.show()

这给了我这个数字

所以我为每个过滤数据

最后三个图产生潦草的线条。现在我明白了,由于我基于列的四个值(即 Erste_15_Minuten、Zweite_15_Minuten、Dritte_15_Minuten 和 Letzte_15_Minuten)过滤数据,因此最后三个图的 xticks 数量不相等或可能以不同的顺序排列。有没有办法可以避免这个问题?切换到条形图可以避免这个问题,但我只需要使用线图。提前谢谢你。

【问题讨论】:

您的示例代码不包含任何数据或 scribble 图的生成方式。看来您的 x 轴是一个分类的,我认为您需要通过将 NaN 放在 y 轴值中来“过滤”,并且 x 轴在所有子图中保持一致 【参考方案1】: 查看您的代码。 dict中有多个相同格式的数据框 无法保证这些数据帧的 KurzName 顺序相同 具有符合上述理解的模拟数据 然后提供了一种重新排序数据帧以与生成线图的第三帧一致的方法
    合并到 KurzName 上的第一个数据帧 使用第一个数据帧的索引来定义排序顺序
查看图像 条形图 - 好的,不依赖于订单 第一个折线图是潦草的,第二个不是 因此强制数据帧的顺序已经解决了问题
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# fmt: off
words = ['adipisci', 'aliquam', 'amet', 'consectetur', 'dolor', 'dolore', 'dolorem', 'eius', 'est', 'etincidunt', 'ipsum', 'labore', 'magnam', 'modi', 'neque', 'non', 'numquam', 'porro', 'quaerat', 'quiquia', 'quisquam', 'sed', 'sit', 'tempora', 'ut', 'velit', 'voluptatem']
# fmt: on

r = np.random.choice(words, [2, 30])
r = np.char.add(r[0], np.char.add("_", r[1]))

# Erste_15_Minuten, Zweite_15_Minuten, Dritte_15_Minuten and Letzte_15_Minuten the number
df_dict_nValueAgg = 
for k in [
    "Erste_15_Minuten",
    "Zweite_15_Minuten",
    "Dritte_15_Minuten",
    "Letzte_15_Minuten",
]:
    np.random.shuffle(r)
    df_dict_nValueAgg[k] = pd.DataFrame(
        
            "KurzName": r,
            "Count": np.random.randint(100, 300, len(r)),
            "min_nValueNorm": np.random.uniform(0, 0.5, len(r)),
            "max_nValueNorm": np.random.uniform(0.5, 1, len(r)),
        
    )

fig = make_subplots(
    rows=5,
    cols=1,
    vertical_spacing=0.05,
    subplot_titles=[
        "Count / Anzahl",
        "min_nValue",
        "max_nValue",
        "avg_nValue",
        "sum_nValue",
    ],
    shared_xaxes=True,
)

for k in df_dict_nValueAgg.keys():
    fig.add_trace(
        go.Bar(
            x=df_dict_nValueAgg[k]["KurzName"], y=df_dict_nValueAgg[k]["Count"], name=k
        ),
        row=1,
        col=1,
    )


# this will be scibbled as each dataframe is in a different order
for k in df_dict_nValueAgg.keys():
    fig.add_trace(
        go.Scatter(
            x=df_dict_nValueAgg[k]["KurzName"],
            y=df_dict_nValueAgg[k]["max_nValueNorm"],
            name=k + " scribble max",
        ),
        row=4,
        col=1,
    )

# force order of dataframes to be same as first
for i, k in enumerate(df_dict_nValueAgg.keys()):
    df = df_dict_nValueAgg[k]
    if i > 0:
        df = df.merge(
            df_dict_nValueAgg[list(df_dict_nValueAgg.keys())[0]]
            .loc[:, "KurzName"]
            .reset_index(),
            on="KurzName",
        ).sort_values("index")

    fig.add_trace(
        go.Scatter(
            x=df["KurzName"],
            y=df["max_nValueNorm"],
            name=k + " max",
        ),
        row=5,
        col=1,
    )


fig

【讨论】:

以上是关于如何摆脱情节线图中的潦草线条?的主要内容,如果未能解决你的问题,请参考以下文章

如何在情节线图中有选择地隐藏图例?

在情节图中标记特殊日子

如何摆脱或更改情节提要以编程方式创建 segue

R:在线条图中,你如何控制每个点(而不是每个系列)使用的角色?

Plotly:如何更改图例中显示的线条的大小?

如何根据条件为ggplot中的线条着色?