python - Seaborn 散点图帮助:使用直观的 x 轴绘制数据集
问题描述
我不完全知道如何表达这个问题(所以如果你有更好的措辞的想法,请发表评论)但我将提供一个数据类型的示例来解释我拥有什么以及我想要绘制什么。现在我有一个数据集,我正在尝试构建一个散点图,其中 x 轴是距离,y 轴是时间。
数据集如下所示:
start end time group
0 4 0.91 1
2 12 0.98 1
12 15 0.88 1
0 4 0.925 2
2 12 0.902 2
12 15 1.0 2
....
我将数据集读入 pandas 并制作了一个散点图,就像在 y 轴上绘制时间和在 x 轴上绘制起始距离点一样。快速编辑,但我还想根据“组”类别设置色调/点样式:
fig_dims = (24, 16)
fig, ax = plt.subplots(figsize=fig_dims)
sns.scatterplot(data=dfand looks like this,ax=ax, x= "start", y="time",hue="group",style="group",s=1)
sns.set_style("white")
plt.show()
我遇到的问题是当数据变得更复杂时绘制相同的图。具体来说,上面的这个数据集正在使用从 0 到 15 的连续 x 轴刻度,但我有一个类似的数据集,我不是使用连续数据,而是使用由计数重置为零的标记类别分解的数据:
start end time group marker
0 4 0.91 1 1
2 12 0.98 1 1
12 15 0.88 1 1
0 4 0.9252 1 1
2 12 0.9022 1 1
12 15 1 2 1
1 6 0.91 1 2
3 11 0.98 1 2
11 22 0.88 1 2
1 6 0.9252 2 2
3 11 0.9022 2 2
11 22 1 2 2
1 6 0.91 1 3
3 11 0.98 1 3
11 22 0.88 1 3
1 6 0.9252 2 3
3 11 0.9022 2 3
11 22 1 2 3
....
因此,在此示例中,假设标记 1 的长度为 15 (0-15),标记 2 的长度为 22 (0-22),并且这两个标记不重叠而是连续的,所以我想要绘制的是具有相同 y 时间轴的散点图,但在 x 轴上迭代不同的标记,并依次具有标记 1、标记 2、标记 3 等。
我的想法是我会输入一个订单/长度文件,其中包含有关标记 id 和该标记长度的信息,如下所示:
marker start end
1 0 15
2 0 22
然后我将开始遍历我的数据帧中标记 1 的值,一旦我击中第二个标记,我将创建一个考虑到标记 1 的距离的新值,因此最终绘制一个修改为的最终数据集看起来像这样,其中标记 2 的开始/结束值添加了 15,以表示其起点紧跟标记 1 而不是文字 0。
start end time group marker
0 4 0.91 1 1
2 12 0.98 1 1
12 15 0.88 1 1
0 4 0.925 2 1
2 12 0.902 2 1
12 15 1.0 2 1
16 21 0.91 1 2
18 26 0.98 1 2
26 37 0.88 1 2
16 21 0.925 2 2
18 26 0.902 2 2
26 37 1.0 2 2
....
我很难找到一种很好的自动方法来在 python 中进行这种转换/计算,并且可以使用一些帮助来构建一个循环来迭代它。最终,我有多个数据集,其中包含 3 到 100 个标记和这些标记内的可变距离,因此它必须适应不同的数字,我想使用带有标记和开始/结束数据的输入文件作为订购方式这样输出总是首先有标记 1,然后是标记 2,依此类推(这里的变量并不总是数字,所以很容易给它一个文件,指定我认为的订单)。
提前感谢您的任何建议。
编辑我的解决方案
我相信在玩弄了一些东西之后我可能已经解决了这个问题(我想我想多了)。这就是我所做的,其中 data.txt 是原始数据集文件,标签是描述起始长度的文件:
df_data = pd.read_csv("data.txt")
df_labels= pd.read_csv("labels.txt")
order=list(df_labels.marker)
lengths=dict(zip(df_labels.marker,df_labels.end))
print(lengths)
count=0
df_edited=df_data.copy()
for l in order[1:]:
df_edited.loc[df_edited.marker==l, 'start']+=(count+lengths[l-1])
df_edited.loc[df_edited.marker==l,'end']+=(count+lengths[l-1])
count+=lengths[l]
print(df_edited)
这导致我得到这个输出:
start end time group marker
0 0 4 0.9100 1 1
1 2 12 0.9800 1 1
2 12 15 0.8800 1 1
3 0 4 0.9252 1 1
4 2 12 0.9022 1 1
5 12 15 1.0000 2 1
6 16 21 0.9100 1 2
7 18 26 0.9800 1 2
8 26 37 0.8800 1 2
9 16 21 0.9252 2 2
10 18 26 0.9022 2 2
11 26 37 1.0000 2 2
12 45 50 0.9100 1 3
13 47 55 0.9800 1 3
14 55 66 0.8800 1 3
15 45 50 0.9252 2 3
16 47 55 0.9022 2 3
17 55 66 1.0000 2 3
这似乎正确地绘制:
如果有人能想到任何更有效的方法,请告诉我,或者如果您对如何在绘图上添加一个标签有任何想法,除了 x 轴刻度线之外,它还指示标记 1 和标记 2 的开始位置,这将非常有帮助.
解决方案
推荐阅读
- php - 在 2 个站点之间转移会话?
- python - 为什么在大循环中使用按位运算时运行时间如此之长?
- javascript - 从 javascript 日期对象中获取用户定义的日期字符串
- mongodb - MongoDB返回没有任何父文档的嵌入式文档的嵌入式文档?
- c - 如何扫描用户的字数以打印字符串?
- html - 如何使用 ngFor 和 table [Angular] 显示矩阵等数组元素
- react-native - 导航到与反应导航混淆的屏幕
- javascript - 在 PHP 中使用 JavaScript 函数结果
- excel - ActiveX 组件无法创建对象,使用 .dll/.tlb 时
- javascript - 如何更改类指定的 h2 标记中的硬编码文本?