[英]controlling order of points in ggplot2 in R?
假設我在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))
當我這樣做時,標記為“點”(綠色)的散點將繪制在帶有標記“ a”的紅色點的頂部。 哪些因素控制着ggplot中的z排序,即哪些因素控制着哪一點在頂部? 例如,如果我希望所有“ a”點都位於所有標記為“ point”的點上(這意味着它們有時會部分或完全隱藏該點)怎么辦? 這是否取決於標簽的字母數字順序? 我想找到一個可以輕松轉換為rpy2的解決方案。 謝謝
ggplot2
將ggplot2
創建繪圖,並且在每一層中,繪圖順序由geom
類型定義。 默認設置是按照它們在data
出現的順序進行繪制。
此處有不同之處。 例如
geom_line
連接觀察值,按x值排序。
和
geom_path
以數據順序連接觀察
關於factors
的排序也存在一些已知問題 ,有趣的是注意到軟件包作者Hadley的回答
繪圖的顯示應與數據框的順序保持不變-其他任何東西都是錯誤。
請記住,這是按指定順序繪制的圖層,因此過度繪圖可能會成為問題,尤其是在創建密集散點圖時。 因此,如果您想要一個一致的繪圖(而不是一個依賴於數據框中順序的繪圖),則需要多做一些考慮。
如果希望某些值出現在其他值之上,則可以使用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
避免過度繪制問題的另一種方法是設置點的alpha
(透明度)。 這將不如上面的顯式第二層方法那么有效,但是,明智地使用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))
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()
ggplot2版本<2.0.0的2015年原始答案
在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))))
這里的基本問題可以這樣改寫:
如何控制情節的層次?
在“ 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函數進行數據處理而陷入困境。 在這里,我們要創建兩層:一層帶有“ a”標簽,一層帶有“ point”標簽。
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(...)
函數之外很重要,因此我們可以按字aes(...)
指定這些值。 否則,“ ggplot”功能通常將根據數據中找到的級別分配顏色和大小。 例如,如果您在數據中具有2和5的大小值,它將為值2的任何出現分配默認大小,並為值5 的任何出現分配更大的大小。'aes'函數規范將請勿將值2和5用於尺寸。 顏色也一樣。 我有要使用的確切大小和顏色,因此我將這些參數移到了'geom_plot'函數本身中。 此外,“ aes”功能中的任何規范都將被添加到圖例中,這實際上是沒有用的。
最后說明 :在此示例中,您可以通過多種方式獲得所需的結果,但是了解“ ggplot2”圖層如何工作以從“ ggplot”圖表中獲得最大收益非常重要。 只要在調用“ ggplot”函數之前將數據分成不同的層,就可以控制如何在屏幕上繪制圖形。
它是按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))),]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.