假设我密谋在R,其中每个点可能是由不同的颜色标记GGPLOT2密集散点图:
df <- data.frame(x=rnorm(500))
df$y = rnorm(500)*0.1 + df$x
df$label <- c("a")
df$label[50] <- "point"
df$size <- 2
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size))
当我这样做,散射点标有“点”(绿色)绘制在其带有标签“一”红点之上。 什么控制在ggplot这ž顺序,即什么控制这点是在其顶部? 例如,如果我想要的所有的“a”点上标有“点”的所有各点的上方(这意味着他们有时会部分或全部隐藏点)? 这是否取决于标签的字母顺序? 我想找到可以很容易地转换为rpy2的解决方案。 谢谢
Answer 1:
ggplot2
将创建绘图层-层和每层内,绘制顺序由定义geom
类型。 默认值是它们出现在顺序绘制data
。
如果这是不同的,需要注意。 例如
geom_line
连接观察,通过X值排序。
和
geom_path
连接在数据以便观察
也有关于排序已知问题factors
,而且有趣的是,包的作者哈德利的响应
曲线的显示应该是不变的数据帧的顺序 - 别的是一个错误。
这句话一点,一层是绘制按照指定的顺序,所以overplotting 可以是一个问题,创造密集的散点图时尤其如此。 所以,如果你想有一个一致的情节(而不是一个依赖于数据帧的顺序),你需要考虑多一点。
创建的第二层
如果你想一定值出现上述以外的值,你可以使用subset
参数来创造绝对可以事后绘制的第二层。 您将需要显式加载plyr
包等等.()
会工作。
set.seed(1234)
df <- data.frame(x=rnorm(500))
df$y = rnorm(500)*0.1 + df$x
df$label <- c("a")
df$label[50] <- "point"
df$size <- 2
library(plyr)
ggplot(df) + geom_point(aes(x = x, y = y, color = label, size = size)) +
geom_point(aes(x = x, y = y, color = label, size = size),
subset = .(label == 'point'))
更新
在ggplot2_2.0.0
,该subset
的说法已经过时了。 使用如base::subset
选择在指定的相关数据data
的说法。 而无需加载plyr
:
ggplot(df) +
geom_point(aes(x = x, y = y, color = label, size = size)) +
geom_point(data = subset(df, label == 'point'),
aes(x = x, y = y, color = label, size = size))
或者使用alpha
避免overplotting的问题的另一种方法是,设置alpha
的点的(transparancy)。 这会不会是如上面明确第二层方法一样有效,然而,如果使用得当的scale_alpha_manual
你应该能够得到的东西的工作。
例如
# set alpha = 1 (no transparency) for your point(s) of interest
# and a low value otherwise
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size,alpha = label)) +
scale_alpha_manual(guide='none', values = list(a = 0.2, point = 1))
Answer 2:
2016更新:
订单审美已被弃用 ,所以在这一点最简单的方法是让绿色点是在底部进行排序data.frame,并绘制最后。 如果你不想改变原始data.frame,你可以在ggplot通话过程中对其进行排序-这是一个使用一个例子%>%
并arrange
从dplyr包做的即时排序:
library(dplyr)
ggplot(df %>%
arrange(label),
aes(x = x, y = y, color = label, size = size)) +
geom_point()
原2015年的答案GGPLOT2版本<2.0.0
在GGPLOT2,你可以使用命令审美 ,以指定点绘制的顺序。 绘制的最后的将会出现在顶部。 要应用此,您可以创建一个变量保存在您希望的点要绘制的顺序。
由他人密谋后,它把在顶部的绿点:
df$order <- ifelse(df$label=="a", 1, 2)
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=order))
还是先绘制绿点和埋葬它,以相反的顺序绘制点:
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=-order))
对于这个简单的例子,你可以跳过创建一个新的分类变量,只是要挟label
变量的因素,然后一个数字:
ggplot(df) +
geom_point(aes(x=x, y=y, color=label, size=size, order=as.numeric(factor(df$label))))
Answer 3:
最根本的问题在这里可以改写如下:
如何控制我的情节层层?
在“GGPLOT2”包,您可以通过拆分每个不同的层进不同的命令迅速地做到这一点。 在层的思维需要练习的一点点,但它本质归结到你想要绘制在其他事情上面什么。 您从向上的背景下建立。
准备 :准备样品的数据。 此步骤仅在这个例子中必要的,因为我们没有实际数据的工作。
# Establish random seed to make data reproducible.
set.seed(1)
# Generate sample data.
df <- data.frame(x=rnorm(500))
df$y = rnorm(500)*0.1 + df$x
# Initialize 'label' and 'size' default values.
df$label <- "a"
df$size <- 2
# Label and size our "special" point.
df$label[50] <- "point"
df$size[50] <- 4
您可能注意到,我添加了一个不同大小的例子只是为了让层差异明显。
第1步 :分离你的数据分层。 始终做到这一点之前,您使用“ggplot”功能。 太多的人试图从与“ggplot”功能做数据操作卡住。 在这里,我们要创建两个层次:一个与“一”的标签,并用一个“点”的标签。
df_layer_1 <- df[df$label=="a",]
df_layer_2 <- df[df$label=="point",]
你可以与其他功能做到这一点,但我只是快速使用数据帧匹配逻辑提取数据。
步骤2:简介的数据作为层。 我们要首先绘制所有的“a”的数据,然后绘制所有的“点”的数据。
ggplot() +
geom_point(
data=df_layer_1,
aes(x=x, y=y),
colour="orange",
size=df_layer_1$size) +
geom_point(
data=df_layer_2,
aes(x=x, y=y),
colour="blue",
size=df_layer_2$size)
注意,基极层积ggplot()
没有分配数据。 这一点很重要,因为我们要覆盖数据,每一层。 然后,我们有两个不同点几何层geom_point(...)
使用自己的规格。 x和y轴将被共享,但是我们将使用不同的数据,颜色和大小。
它以移动以外的颜色和大小规格是非常重要的aes(...)
的功能,所以我们可以从字面上指定这些值。 否则,根据在数据中发现的水平的“ggplot”功能通常会分配颜色和大小。 例如,如果你在数据的2和5的大小值,将分配一个默认大小为值2的任何次出现,并且将一些较大尺寸分配给值5. 一种“AES”功能规范将任何出现未使用的值2和5的尺寸。 这同样适用于颜色。 我有确切的尺寸和我想使用的颜色,所以我动这些参数到“geom_plot”功能本身。 此外,在“AES”功能,任何规格将投入的传说,这可真没用。
最后说明一点 :在这个例子中,你可以在很多方面实现了想要的结果,但了解“GGPLOT2”层,以获得最出你的“ggplot”排行榜是如何工作是很重要的。 只要你将数据分成不同的层,你所说的“ggplot”功能之前,你有过怎样的事情会在屏幕上绘制大量的控制。
Answer 4:
它是绘制在data.frame行的顺序。 试试这个:
df2 <- rbind(df[-50,],df[50,])
ggplot(df2) + geom_point(aes(x=x, y=y, color=label, size=size))
正如你看到绿色的点,最后绘制的,因为它代表了data.frame的最后一排。
这里是一个方式订购data.frame有绿点的第一得出:
df2 <- df[order(-as.numeric(factor(df$label))),]
文章来源: controlling order of points in ggplot2 in R?