我一直在尝试使用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轴是多类别的,但我不确定如何修改它。
我不知道为什么这不起作用,如果有人能为我指出正确的方向,那将非常有帮助。
好吧,答案比我预期的要简单得多。基本上我的代码需要以几乎完全相同的方式设置,再加上一个关键的更改:我需要在每个序列上再进行一个 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 轴,但只有两个类别(组和样本),因为这似乎最适合绘图的当前设置。