簡體   English   中英

將手動圖例添加到 ggplot

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM