我正在尝试在一个图中绘制三个数据系列。每个系列的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)数据点的最佳方法是什么?如何正确绘制它们?
答案 0 :(得分:2)
我认为您实际上想要转换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))