[英]Adding manual legend to a ggplot
我有以下代碼生成附加的 plot。 我想知道如何在圖表的形成中包含一個圖例,因為我似乎無法做到這一點。 我想要的手動圖例是“cols”向量,詳細說明了每個樣本大小的不同顏色。
N <- 100
gamma <- 1/12 #scale parameter
beta <- 0.6 #shape parameter
u <- runif(N)
v <- runif(N)
tau <- -gamma*log(u)*(sin(beta*pi)/tan(beta*pi*v)-cos(beta*pi))^(1/beta)
OX <- sort(tau)
CumWealth <- cumsum(OX)/sum(tau)
PoorPopulation <- c(1:N)/N
index <- c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.99,0.999,0.9999,0.99999,0.999999,1)*N
QQth <- CumWealth[index]
x <- PoorPopulation[index]
Lorenzdf <- data.frame(x, QQth)
cols <- c("100"="blue","1000"="green","10000"="red", "1e+05" = "black")
colors = c("green", "red", "black")
g <- ggplot(data=Lorenzdf, aes(x=x, y=QQth)) +
geom_point(color = "blue") +
geom_line(color = "blue") +
ggtitle(paste("Convergence of empirical Lorenz curve for Beta = ", beta, sep = " ")) +
xlab("Cumulative share of people from lowest to highest wealth") +
ylab("Cumulative share of wealth") +
scale_color_manual(name="Sample size",values=cols)
sample_sizes <- c(1000, 10000, 100000)
for (i in 1:3) {
gamma <- 1/12 #scale parameter
beta <- 0.6 #shape parameter
u <- runif(sample_sizes[i])
v <- runif(sample_sizes[i])
tau <- -gamma*log(u)*(sin(beta*pi)/tan(beta*pi*v)-cos(beta*pi))^(1/beta)
OX <- sort(tau)
CumWealth <- cumsum(OX)/sum(tau)
PoorPopulation <- c(1:sample_sizes[i])/sample_sizes[i]
index < c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.99,0.999,0.9999,0.99999,0.999999,1)*sample_sizes[i]
QQth <- CumWealth[index]
x <- PoorPopulation[index]
Lorenzdf <- data.frame(x, QQth)
g <- g + geom_point(data = Lorenzdf, aes(x = x, y = QQth), color = colors[i])
g <- g + geom_line(data = Lorenzdf, aes(x = x, y = QQth), color = colors[i])
}
g
要獲得圖例,只需從五個中制作一個 dataframe 並一步完成繪圖,而不是在循環中添加層。
我的方法使用purrr::map
按樣本大小設置數據集並使用dplyr::bind_rows
綁定它們。 在這些准備步驟之后,我們通過將樣本大小映射到顏色來自動獲取圖例。 嘗試這個:
library(ggplot2)
library(dplyr)
library(purrr)
N <- 100
gamma <- 1/12 #scale parameter
beta <- 0.6 #shape parameter
make_lorenz <- function(N, gamma, beta) {
u <- runif(N)
v <- runif(N)
tau <- -gamma*log(u)*(sin(beta*pi)/tan(beta*pi*v)-cos(beta*pi))^(1/beta)
OX <- sort(tau)
CumWealth <- cumsum(OX)/sum(tau)
PoorPopulation <- c(1:N)/N
index <- c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.99,0.999,0.9999,0.99999,0.999999,1)*N
QQth <- CumWealth[index]
x <- PoorPopulation[index]
data.frame(x, QQth)
}
sample_sizes <- c(100, 1000, 10000, 100000)
Lorenzdf <- purrr::map(sample_sizes, make_lorenz, gamma = gamma, beta = beta) %>%
setNames(sample_sizes) %>%
bind_rows(.id = "N")
cols <- c("100"="blue","1000"="green","10000"="red", "1e+05" = "black")
g <- ggplot(data=Lorenzdf, aes(x=x, y=QQth, color = N)) +
geom_point() +
geom_line() +
ggtitle(paste("Convergence of empirical Lorenz curve for Beta = ", beta, sep = " ")) +
xlab("Cumulative share of people from lowest to highest wealth") +
ylab("Cumulative share of wealth") +
scale_color_manual(name="Sample size",values=cols)
g
由代表 package (v0.3.0) 於 2020 年 6 月 27 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.