将几个 X,Y 列对绘制为数据系列,同时排除 (0,0) 点
Plotting several X,Y column pairs as data series, while excluding (0,0) points
我正在尝试在一个图中绘制三个数据系列。每个系列的 X 和 Y 坐标位于我的数据框中的单独列中:
X1 Y1 X2 Y2 X3 Y3
1 0 1 0 2 0 3
2 1 2 1 3 1 4
3 2 3 2 4 2 5
4 3 4 3 5 3 6
5 4 5 4 6 4 7
6 5 6 5 7 5 8
7 6 7 6 8 6 9
8 0 0 7 9 7 8
9 0 0 8 8 0 0
10 0 0 9 7 0 0
由于每个系列的尾随 (0,0) 数据点无效,因此最终应该只绘制这部分点:
X1 Y1 X2 Y2 X3 Y3
1 0 1 0 2 0 3
2 1 2 1 3 1 4
3 2 3 2 4 2 5
4 3 4 3 5 3 6
5 4 5 4 6 4 7
6 5 6 5 7 5 8
7 6 7 6 8 6 9
8 7 9 7 8
9 8 8
10 9 7
此外,第一个系列的X轴应该倒转:
即使没有先清理数据框,我也很难在 ggplot2 中将列对绘制为单独的系列(参见 'legend')。
require(ggplot2)
report <- function(df){
plot = ggplot(data=df, aes(x=-X1, y=Y1, size=3)) + #inverted X-axis of series 1
layer(geom="point") +
geom_point(aes(X2, Y2, colour="red", size=2)) +
geom_point(aes(X3, Y3, colour="blue", size=1)) +
xlab("X") + ylab("Y")
print(plot)
}
X1 = c(0,1,2,3,4,5,6,0,0,0)
Y1 = c(1,2,3,4,5,6,7,0,0,0)
X2 = c(0,1,2,3,4,5,6,7,8,9)
Y2 = c(2,3,4,5,6,7,8,9,8,7)
X3 = c(0,1,2,3,4,5,6,7,0,0)
Y3 = c(3,4,5,6,7,8,9,8,0,0)
df <- data.frame(X1,Y1,X2,Y2,X3,Y3)
colnames(df) <- c("X1","Y1","X2","Y2","X3","Y3")
report(df)
去除每个系列中无效 (0,0) 数据点的最佳方法是什么?我应该如何正确绘制它们?
我认为您实际上想要转换 data.frame
以使您的 ggplot
调用更简洁。这是使用 dplyr
包转换数据正确绘制数据的更新版本。
回应要求在 dplyr
上提供更多信息的评论。它提供了 %>%
运算符,它只是将左侧的参数作为第一个参数传递给右侧的函数。它允许更易读的 R
代码。 mutate
函数通过手动设置变量来添加 Series
变量,前提是知道哪些点属于哪个系列。然后 filter
函数删除您指出不需要的 0,0
点。您可以在这些操作之后检查 df
以查看最终输出。希望这有助于解释下面的代码。这里还有一个 link to the dplyr
page.
library(dplyr)
df <- rbind.data.frame(
data.frame(X=-X1, Y=Y1),
data.frame(X=X2, Y=Y2),
data.frame(X=X3, Y=Y3))
df <- df %>%
mutate(Series=rep(c('S1', 'S2', 'S3'), each=10)) %>%
filter(!(X == 0 & Y == 0))
png('foo.png')
ggplot(df) + geom_point(aes(x=X, y=Y, color=Series, size=Series))
dev.off()
此外,如果您想手动设置颜色和大小的值以及添加理想示例图中的线条,这里有一个更复杂的 ggplot
命令:
ggplot(df, aes(x=X, y=Y, color=Series, size=Series)) +
geom_point() + geom_line(size=1) + theme_bw() +
scale_color_manual(values=c('black', 'red', 'blue')) +
scale_size_manual(values=seq(4,2,-1))
我正在尝试在一个图中绘制三个数据系列。每个系列的 X 和 Y 坐标位于我的数据框中的单独列中:
X1 Y1 X2 Y2 X3 Y3
1 0 1 0 2 0 3
2 1 2 1 3 1 4
3 2 3 2 4 2 5
4 3 4 3 5 3 6
5 4 5 4 6 4 7
6 5 6 5 7 5 8
7 6 7 6 8 6 9
8 0 0 7 9 7 8
9 0 0 8 8 0 0
10 0 0 9 7 0 0
由于每个系列的尾随 (0,0) 数据点无效,因此最终应该只绘制这部分点:
X1 Y1 X2 Y2 X3 Y3
1 0 1 0 2 0 3
2 1 2 1 3 1 4
3 2 3 2 4 2 5
4 3 4 3 5 3 6
5 4 5 4 6 4 7
6 5 6 5 7 5 8
7 6 7 6 8 6 9
8 7 9 7 8
9 8 8
10 9 7
此外,第一个系列的X轴应该倒转:
即使没有先清理数据框,我也很难在 ggplot2 中将列对绘制为单独的系列(参见 'legend')。
require(ggplot2)
report <- function(df){
plot = ggplot(data=df, aes(x=-X1, y=Y1, size=3)) + #inverted X-axis of series 1
layer(geom="point") +
geom_point(aes(X2, Y2, colour="red", size=2)) +
geom_point(aes(X3, Y3, colour="blue", size=1)) +
xlab("X") + ylab("Y")
print(plot)
}
X1 = c(0,1,2,3,4,5,6,0,0,0)
Y1 = c(1,2,3,4,5,6,7,0,0,0)
X2 = c(0,1,2,3,4,5,6,7,8,9)
Y2 = c(2,3,4,5,6,7,8,9,8,7)
X3 = c(0,1,2,3,4,5,6,7,0,0)
Y3 = c(3,4,5,6,7,8,9,8,0,0)
df <- data.frame(X1,Y1,X2,Y2,X3,Y3)
colnames(df) <- c("X1","Y1","X2","Y2","X3","Y3")
report(df)
去除每个系列中无效 (0,0) 数据点的最佳方法是什么?我应该如何正确绘制它们?
我认为您实际上想要转换 data.frame
以使您的 ggplot
调用更简洁。这是使用 dplyr
包转换数据正确绘制数据的更新版本。
回应要求在 dplyr
上提供更多信息的评论。它提供了 %>%
运算符,它只是将左侧的参数作为第一个参数传递给右侧的函数。它允许更易读的 R
代码。 mutate
函数通过手动设置变量来添加 Series
变量,前提是知道哪些点属于哪个系列。然后 filter
函数删除您指出不需要的 0,0
点。您可以在这些操作之后检查 df
以查看最终输出。希望这有助于解释下面的代码。这里还有一个 link to the dplyr
page.
library(dplyr)
df <- rbind.data.frame(
data.frame(X=-X1, Y=Y1),
data.frame(X=X2, Y=Y2),
data.frame(X=X3, Y=Y3))
df <- df %>%
mutate(Series=rep(c('S1', 'S2', 'S3'), each=10)) %>%
filter(!(X == 0 & Y == 0))
png('foo.png')
ggplot(df) + geom_point(aes(x=X, y=Y, color=Series, size=Series))
dev.off()
此外,如果您想手动设置颜色和大小的值以及添加理想示例图中的线条,这里有一个更复杂的 ggplot
命令:
ggplot(df, aes(x=X, y=Y, color=Series, size=Series)) +
geom_point() + geom_line(size=1) + theme_bw() +
scale_color_manual(values=c('black', 'red', 'blue')) +
scale_size_manual(values=seq(4,2,-1))