如何让散点图中的标记仅沿一个轴通过线连接?

问题描述 投票:0回答:1

我一直在尝试使用plotly包创建散点图,但我一直遇到一个关于绘图格式的奇怪问题。我试图绘制的图有一个分类 X 轴和一个连续 Y 轴。我想要的是标记用标记来描绘绘图上的每个点,然后让每个标记用一条线相互连接。这听起来应该是一个相对简单的格式化任务,但我一直无法让它工作。

这是我输入代码的示例数据帧的快照:

这是我正在使用的当前代码,其中 df 是我的输入数据框:

grouping = df.set_index(sample_col)[group_col].to_dict()
fig = make_subplots(2, 1, subplot_titles=subplot_titles)
n = 0
colors = ["red","blue"]
colors_dict = {color_col_value:color for color_col_value,color in zip(list(df[class_col].unique()), colors)}
symbols = ["diamond", "arrow"]
symbols_dict = {id_type:symbol for id_type,symbol in zip(df[class_col].unique(), symbols)}
for index, gdf in enumerate(df.groupby([class_col])):
    m, gdf = gdf
    gdf = natsort_column(gdf, sample_col).reset_index(drop=True)
    gdf[group_col] = gdf[sample_col].map(grouping)
    fig.append_trace(go.Scatter(x=[gdf[group_col], gdf[sample_col], gdf['Sequence']],
                                        y=gdf[intensity_col],
                                        name=m,
                                        mode='markers',
                                        marker=dict(symbol=symbols_dict[m], size=12, color=colors_dict[m]),
                                        legendgroup='group{}'.format(index),
                                        showlegend=True),n,1)
    n+=1

fig.update_layout(template='plotly_white', height=1000, width=800)
fig.update_xaxes(categoryorder='array', categoryarray=sorted(samples))

当我将散点图的

mode
设置为
markers
时,该图如下所示:

但是,我真的希望标记能够用线条连接起来。但是当我设置

mode='lines+markers'
时,我得到一个看起来像这样的图:

标记均沿 x 轴和 y 轴连接。这很令人沮丧,因为我只希望标记沿 x 轴连接,其中标记根据其相应的顺序连接。这确实意味着并非所有标记都会在不同样本之间连接,但这无论如何都是我想要的。沿着强度值连接标记对于我想要可视化的内容根本没有用。我怀疑这个问题的根源是x轴是多类别的,但我不确定如何修改它。

我不知道为什么这不起作用,如果有人能为我指出正确的方向,那将非常有帮助。

python plotly plotly.graph-objects
1个回答
0
投票

好吧,答案比我预期的要简单得多。基本上我的代码需要以几乎完全相同的方式设置,再加上一个关键的更改:我需要在每个序列上再进行一个 for 循环。我对如何将信息添加到情节有一个根本性的误解,但现在很清楚了。

所以代码现在看起来像:

grouping = df.set_index(sample_col)[group_col].to_dict()
fig = make_subplots(2, 1, subplot_titles=subplot_titles)
n = 0
colors = ["red","blue"]
colors_dict = {color_col_value:color for color_col_value,color in zip(list(df[class_col].unique()), colors)}
symbols = ["diamond", "arrow"]
symbols_dict = {id_type:symbol for id_type,symbol in zip(df[class_col].unique(), symbols)}
for index, gdf in enumerate(df.groupby([class_col])):
    m, gdf = gdf
    gdf = natsort_column(gdf, sample_col).reset_index(drop=True)
    gdf[group_col] = gdf[sample_col].map(grouping)
    for sequence in gdf['Sequence'].unique():
        gdf_seq = gdf[gdf['Sequence']==sequence]
        fig.append_trace(go.Scatter(x=[gdf_seq[group_col], gdf_seq[sample_col]],
                                        y=gdf_seq[intensity_col],
                                        name=m,
                                        mode='markers',
                                        marker=dict(symbol=symbols_dict[m], size=12, color=colors_dict[m]),
                                        legendgroup='group{}'.format(index),
                                        showlegend=True),n,1)
    n+=1

fig.update_layout(template='plotly_white', height=1000, width=800)
fig.update_xaxes(categoryorder='array', categoryarray=sorted(samples))

现在绘图已正确配置,每个序列有一条线和一组标记。我仍然有多类别 x 轴,但只有两个类别(组和样本),因为这似乎最适合绘图的当前设置。

© www.soinside.com 2019 - 2024. All rights reserved.