首页 > 解决方案 > 带有ggplot2(R)的每个系列密度2d的单个时装线

问题描述

我有一个名为的数据集(可在这篇文章的底部找到)q,它说明了 70 个(x,y)坐标来研究电荷周围的电场(7 个电场值,因此每个给定电场有 10 个坐标)。我想为每个电场绘制等势线。这是该数据的散点图,使用ggplot2在此处输入图像描述 如果要跟踪它们(基于每个系列),您可以清楚地看到应该在哪里绘制线条。

遇到这篇文章后,我尝试使用,geom_density2d但这是我得到的:在此处输入图像描述

更改h参数也没有达到预期的效果: 如何让s显示每个系列的单行并让该行尽可能接近我的数据?在此处输入图像描述 ggplot2geom_density2d

PS这是原始数据(csv格式):

"E";"x";"y";"Voltage"
"E=4.368 (V)"; 33;-6;4.368
"E=4.368 (V)"; 39;-16;4.368
"E=4.368 (V)"; 54;-22;4.368
"E=4.368 (V)"; 66;-17;4.368
"E=4.368 (V)"; 70;-14;4.368
"E=4.368 (V)"; 71;-2;4.368
"E=4.368 (V)"; 36;6;4.368
"E=4.368 (V)"; 51;12;4.368
"E=4.368 (V)"; 64;13;4.368
"E=4.368 (V)"; 70;4;4.368
"E=3.745 (V)";  6;-69;3.745
"E=3.745 (V)"; 44;-48;3.745
"E=3.745 (V)"; 64;-35;3.745
"E=3.745 (V)"; 77;-15;3.745
"E=3.745 (V)"; 80;-2;3.745
"E=3.745 (V)"; 78;8;3.745
"E=3.745 (V)"; 71;22;3.745
"E=3.745 (V)"; 63;30;3.745
"E=3.745 (V)"; 46;40;3.745
"E=3.745 (V)"; 24;46;3.745
"E=3.120 (V)"; 64;-90;3.120
"E=3.120 (V)"; 70;-73;3.120
"E=3.120 (V)"; 74;-58;3.120
"E=3.120 (V)"; 80;-45;3.120
"E=3.120 (V)"; 88;-18;3.120
"E=3.120 (V)"; 89;-2;3.120
"E=3.120 (V)"; 88;10;3.120
"E=3.120 (V)"; 84;29;3.120
"E=3.120 (V)"; 75;49;3.120
"E=3.120 (V)"; 68;66;3.120
"E=2.495 (V)";102;-96;2.495
"E=2.495 (V)";101;-73;2.495
"E=2.495 (V)";101;-44;2.495
"E=2.495 (V)";102;-22;2.495
"E=2.495 (V)";101;-1;2.495
"E=2.495 (V)";101;10;2.495
"E=2.495 (V)";100;25;2.495
"E=2.495 (V)";100;39;2.495
"E=2.495 (V)";100;48;2.495
"E=2.495 (V)"; 99;52;2.495
"E=1.870 (V)";139;-89;1.870
"E=1.870 (V)";132;-66;1.870
"E=1.870 (V)";124;-46;1.870
"E=1.870 (V)";115;-24;1.870
"E=1.870 (V)";112;-5;1.870
"E=1.870 (V)";114;18;1.870
"E=1.870 (V)";115;23;1.870
"E=1.870 (V)";123;41;1.870
"E=1.870 (V)";127;54;1.870
"E=1.870 (V)";131;69;1.870
"E=1.247 (V)";175;-53;1.247
"E=1.247 (V)";158;-47;1.247
"E=1.247 (V)";142;-37;1.247
"E=1.247 (V)";127;-20;1.247
"E=1.247 (V)";121;-6;1.247
"E=1.247 (V)";124;11;1.247
"E=1.247 (V)";140;30;1.247
"E=1.247 (V)";145;34;1.247
"E=1.247 (V)";155;39;1.247
"E=1.247 (V)";168;45;1.247
"E=0.625 (V)";149;-21;0.625
"E=0.625 (V)";157;-20;0.625
"E=0.625 (V)";137;-16;0.625
"E=0.625 (V)";164;-15;0.625
"E=0.625 (V)";131;-8;0.625
"E=0.625 (V)";169;-5;0.625
"E=0.625 (V)";167;7;0.625
"E=0.625 (V)";161;14;0.625
"E=0.625 (V)";137;18;0.625
"E=0.625 (V)";149;20;0.625

标签: rggplot2

解决方案


所以这可能是关于如何绘制它的部分答案,并且有一些缺点。geom_smooth/问题的解决方案geom_line可能在 中geom_path,它不需要沿 y 轴对数据点进行排序,但它确实需要在数据中对其进行排序。

一个解决方案geom_path可能如下所示(假设zz您发布的数据用引号括起来):

df <- read.csv(text = zz, sep = ";", header = F)

ggplot(df, aes(V2, V3, colour = V1)) +
  geom_point() + # For visualisation purposes
  geom_path()

在此处输入图像描述

现在显然,这并不理想。从您之前的示例中,我假设您希望对点之间的路径进行一些平滑处理。其次,由于该E=0.625 (V)组没有按照我们预期的路径排序,因此该组的显示效果不佳。

为了解决第一个问题,我们可以使用 ggforce 包拟合样条曲线而不是路径:

library(ggforce)
ggplot(df, aes(V2, V3, colour = V1)) +
  geom_point() +
  geom_bspline()

在此处输入图像描述

要解决第二个问题,您必须重新排序数据,在下面的示例中,我是手动完成的,但也许有更简单的方法。

# Note that the 27th row is included twice to close the ellipse
df2 <- df[c(1:27, 29, 31, 35, 36, 34, 33, 32, 30, 28, 27),]

ggplot(df2, aes(V2, V3, colour = V1)) +
  geom_point() +
  geom_bspline()

在此处输入图像描述

此外,您可以尝试实施他们在此处所做的事情。


推荐阅读