[英]Manipulating ggplor2 for categorical/continuous variables in R
我試圖在 R 中繪制分類變量和連續變量。以下代碼在沒有“var_4”的情況下工作,但我似乎無法讓它與所有變量一起工作。
誰能建議如何解決這個問題? 另外,是否可以修改 aes() 函數,以便每個圖形中的條形根據不同的類別具有不同的顏色?
library(ggplot2)
library(gridExtra)
library(tidyr)
# Generate data
var_1 <- rnorm(100, 1, 4)
var_2 <- sample(LETTERS[1:2], 100, replace = TRUE, prob = c(0.3, 0.7))
var_3 <- sample(LETTERS[1:5], 100, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.1))
cluster <- sample(LETTERS[1:4], 100, replace = TRUE,prob = c(2.5, 2.5, 2.5, 2.5))
var_4 <- rnorm(100, 1, 10)
f <- data.frame(var_1, var_2, var_3, var_4, cluster)
f$var_2 = as.factor(f$var_2)
f$var_3 = as.factor(f$var_3)
f$cluster = as.factor(f$cluster)
levs <- sort(unique(c(as.character(f$var_2), as.character(f$var_3))))
f$var_2 <- as.numeric(factor(f$var_2, levs)) + ceiling(max(f$var_1)) + 10
f$var_3 <- as.numeric(factor(f$var_3, levs)) + ceiling(max(f$var_1)) + 10
breaks <- c(pretty(range(f$var_1)), sort(unique(c(f$var_2, f$var_3))))
labs <- c(pretty(range(f$var_1)), levs)
f <- pivot_longer(f, cols = c("var_1", "var_2", "var_3", "var_4"))
ggplot(f, aes(x = value)) + geom_density(data = subset(f, name == "var_1")) +
geom_bar(data = subset(f, name != "var_1"), aes(fill = name)) +
facet_wrap(cluster~name, ncol = 3, scales = "free") +
scale_x_continuous(breaks = breaks, labels = labs) +
scale_fill_manual(values = c("deepskyblue4", "gold"), guide = guide_none())
我認為這里的問題是你已經接受了我對你之前問題的回答,並試圖在沒有真正理解各個部分做了什么的情況下進行調整。
正如我之前解釋的那樣,不應將刻面用作將不相關的圖拼接在一起的一種方式。 這是可能的,但它是hacky 並限制了可擴展性。 嘗試為條形着色添加另一個變量和自定義填充比例幾乎是可能的,但這意味着進一步的調整和妥協。 除非您知道所有部分的作用,否則很難將此方法應用於您的真實數據。 為了清楚起見,我添加了一些評論:
# Generate data
var_1 <- rnorm(100, 1, 4)
var_2 <- sample(LETTERS[1:2], 100, replace = TRUE, prob = c(0.3, 0.7))
var_3 <- sample(LETTERS[1:5], 100, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.1))
cluster <- sample(LETTERS[1:4], 100, replace = TRUE,prob = c(2.5, 2.5, 2.5, 2.5))
var_4 <- rnorm(100, 1, 10)
f <- data.frame(var_1, var_2, var_3, var_4, cluster)
f$var_2 = as.factor(f$var_2)
f$var_3 = as.factor(f$var_3)
f$cluster = as.factor(f$cluster)
# Reorganise factor data into numeric values, grabbing levels as labels first
levs <- sort(unique(c(as.character(f$var_2), as.character(f$var_3))))
f$var_2 <- as.numeric(factor(f$var_2, levs)) + ceiling(max(f$var_1)) + 1000
f$var_3 <- as.numeric(factor(f$var_3, levs)) + ceiling(max(f$var_1)) + 1000
# Calculate the breaks and labels for the x axis
breaks <- c(pretty(range(c(f$var_1, f$var_4)), 8), sort(unique(c(f$var_2, f$var_3))))
labs <- c(pretty(range(c(f$var_1, f$var_4)), 8), levs)
# Pivot data
f <- pivot_longer(f, cols = c("var_1", "var_2", "var_3", "var_4"))
現在我們可以繪制:
ggplot(f, aes(x = value)) +
geom_density(data = subset(f, name == "var_1")) +
geom_density(data = subset(f, name == "var_4")) +
geom_bar(data = subset(f, name != "var_1" & name != "var_4"),
aes(fill = factor(value))) +
facet_wrap(cluster~name, ncol = 4, scales = "free") +
scale_x_continuous(breaks = breaks, labels = labs) +
scale_fill_manual(values = c("red", "orange", "gold", "forestgreen", "deepskyblue4"),
guide = guide_none())
當我運行它時,拋出的錯誤是“錯誤:手動比例中的值不足。需要 3 個,但只提供了 2 個。”
在最后一行中,您只列出了兩種填充顏色。 我添加了“紅色”並生成了一個圖表
ggplot(f, aes(x = value)) +
geom_density(data = subset(f, name == "var_1")) +
geom_bar(data = subset(f, name != "var_1"), aes(fill = name)) +
facet_wrap(cluster~name, ncol = 3, scales = "free") +
scale_x_continuous(breaks = breaks, labels = labs) +
scale_fill_manual(values = c("deepskyblue4", "gold", "red"),
guide = guide_none())
如果您遇到錯誤,將其與您的問題一起發布會很有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.