在 r 中创建自定义图例

阳光女孩

我希望有一个图例,其中包括对所有颜色的引用,而不仅仅是垂直线,并且不包括标题。

我试过 scale_colour_manual 和 scale_fill_manual,它们要么重叠,要么只显示垂直线。我将不胜感激任何建议。

Reprex 在下面,包括自定义调色板。

var1 <- c(head(randu$x,n=12))
var2 <- as.Date(c("2010-01-01","2010-02-01","2010-03-01","2010-04-01","2010-05-01","2010-06-01","2010-07-01","2010-08-01","2010-09-01","2010-10-01","2010-11-01","2010-12-01"))
var3 <- c(tail(randu[which(randu$x + randu$y < 1),]$x,n=12))
var4 <- c(tail(randu[which(randu$x + randu$y < 1),]$y,n=12))

dat <- data.frame(var1,var2,var3,var4)
setDT(dat)
dat$var5 <- dat[,(var3+var4)]

new_dates <- as.Date(c("2010-09-01","2010-05-01"))

cbp2 <- c("#000000", "#56B4E9", "#009E73", "#0072B2", "#D55E00", "#CC79A7")

ggplot()+
  geom_bar(data=dat,colour=cbp2[1],fill = cbp2[1],aes(x=var2,y=var5,colour="var4"),stat="identity")+
  geom_bar(data=dat,colour=cbp2[2],fill = cbp2[2],aes(x=var2,y=var3,colour="var3"),stat="identity")+
  geom_line(data=dat,colour=cbp2[1],aes(x=var2,y=var1))+
  geom_vline(data=data.frame(xintercept = new_dates),
             aes(xintercept = new_dates,linetype = "Changes", colour="red"),
             linetype="dashed",key_glyph = "path")+
  scale_color_manual(name = "",
                     values = c("red",cbp2[2],cbp2[1]), 
                     breaks = c("red",cbp2[2],cbp2[1]),
                     labels = c("Changes","Var3","Var4"))+
  scale_fill_manual(name = "",
                    values = c(cbp2[2],cbp2[1]), 
                    breaks = c(cbp2[2],cbp2[1]),
                    labels = c("var3","var4"))+
  ylab("")+
  xlab("")+
  scale_x_date(expand=c(0,0),date_breaks = "3 month", date_labels =  "%b %y") + 
  scale_y_continuous(labels = function(var5) paste0(var5*100, "%"), 
                     limits=c(0,1),
                     breaks=c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)) +
  theme(panel.background = element_blank(),
        axis.line = element_line(colour = "#000000"),
        axis.text.x = element_text(angle=60, hjust=1),  
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.title.x= (element_text(margin = unit(c(3, 0, 0, 0), "mm"))),
        legend.position = "top")

在此处输入图片说明

chemdork123

这里有很多东西可以打开,但我尽力了。

首先,请考虑您要在这里绘制什么。通常,调用 things 不是问题var1, var2, var3,...然而,在这种情况下,它真的很令人困惑。因此,对于此解决方案,出于我希望在此答案中概述的原因,我将重新发布您重新设计的整个代码,而不仅仅是绘图部分。

数据和问题

综上所述,以下是我对数据集的性质以及您对最终图的渴望的理解:

  • var2数据集中包含Date类信息,这是x整个图的公共轴。

  • var1包含用于绘图层y值的值geom_line

  • var3var4包含用于创建堆叠条形图的值,该条形图应构成图的背景

  • var5是 的总和var3 + var4,并且是创建情节的设备。在这里,考虑到我们要对数据集进行数据分析和 Tidy Data 原则的应用,它不会有用。

  • xinterceptgeom_vline绘图层的作为两个日期提供new_dates

OP 的问题表明需要正确显示图例。在这种情况下,我们要指出:

  • 将条形填充颜色为var3var4
  • 垂直线的性质为红色虚线..称为“变化”
  • geom_line绘图层的标签假设标签是var1

希望一切都是正确的!

合成数据集

我鼓励 OP 参考Tidy Data 原则的使用,这将使将来对此类数据的合成更加简单。在这里,我将把这些原则应用到数据集上dat

首先,让我们处理条形层数据应用整洁数据的原则,我们将要聚集在一起var3,并var4和他们创造出两列:(1)一个用于命名变量(中"var3""var4"),和(2)一项价值我们将告诉ggplot2“堆叠”柱,所以var5这里不需要:ggplot2将自动进行计算。要将列收集在一起,我的首选始终是使用gather()fromdplyrtidyr

library(dplyr)
library(tidyr)
library(ggplot2)
library(data.table)

var1 <- c(head(randu$x,n=12))
var2 <- as.Date(c("2010-01-01","2010-02-01","2010-03-01","2010-04-01","2010-05-01","2010-06-01","2010-07-01","2010-08-01","2010-09-01","2010-10-01","2010-11-01","2010-12-01"))
var3 <- c(tail(randu[which(randu$x + randu$y < 1),]$x,n=12))
var4 <- c(tail(randu[which(randu$x + randu$y < 1),]$y,n=12))

dat <- data.frame(var1,var2,var3,var4)
setDT(dat)
# dat$var5 <- dat[,(var3+var4)]   no longer needed
new_dates <- as.Date(c("2010-09-01","2010-05-01"))
cbp2 <- c("#000000", "#56B4E9", "#009E73", "#0072B2", "#D55E00", "#CC79A7")

newdat <- dat %>% 
  gather(key='var_name', value='value', -var2) # gather all columns except for var2

names(newdat) <- c('Dates', 'var_name', 'value')
newdat$var_name <- factor(newdat$var_name, levels=c('var4', 'var3','var1'))

除了聚集在一起之外,您还会注意到我正在调整列的名称,以使它们在绘图时更容易理解。此外,我正在为newdat$var_name. 这里的目的是我们指定的顺序将与用于创建绘图的顺序相关。我想var3显示为一个 "under" 条var4,所以我们需要先指定它var4

您还可以创建一个单独的数据集,其中包含var2var1用于绘制geom_line图层……但这也可以正常工作。

剧情

对于情节,我尝试将代码组织成不同的部分。OP 试图做的是逐列绘制,而不是使用aes(fill=aes(color=来设置和创建图例。此外,OP 的原始代码中有许多以下示例:

geom_*(aes(color=...), color=...)

这个 in 的结果ggplot2是,如果你在外面设置一个美学值(比如color=同时也在里面声明这个参数,外面的值将覆盖映射内部指定的值——有效地删除任何将其放置在图例中的调用. 这是 OP 示例中出现问题的最大原因,以及为什么某些项目是“正确”的颜色,但没有出现在任何图例中。aes() aes()

指定参数 inaes()仅表示应创建图例并说明ggplot2应用颜色、填充、线型的依据……它实际上并未指定颜色。应使用scale_*_*()函数指定颜色在这种情况下,我们创建了 3 个图例类型。OP 可以按照他们希望的方式进行组织,但我试图让这个示例保持一些说明性,以允许对 OP 的情况进行一些更改,因为仍然不完全清楚图例希望如何完全显示。

请注意,values=它用于应用颜色、线型或填充美学,并通过为该参数提供命名向量来完成。您还可以使用未命名的向量,在这种情况下,将根据该因素的级别顺序应用属性。

请注意,我将 的线条颜色更改geom_line为蓝色...只是为了突出一点。否则会有点混乱,因为填充颜色也是黑色。

ggplot(dat, aes(x=Dates, y=value)) +
  
  # plot layers
  geom_col(
    data=subset(newdat, var_name != 'var1'),
    aes(fill=var_name), position='stack') +
  geom_line(
    data=subset(newdat, var_name == 'var1'),
    aes(color=var_name)
  ) +
  geom_vline(data=data.frame(xintercept = new_dates),
                         aes(xintercept = new_dates, linetype = "Changes"), colour="red",
                         key_glyph = "path")+
 
  # color and legend settings 
  scale_fill_manual(
    name="Fill",
    values=c('var3'=cbp2[2], 'var4'=cbp2[1])) +
  
  scale_color_manual(
    name='Color',
    values = 'blue') +
  
  scale_linetype_manual(
    name='Linetype',
    values=2) +

  # scale adjustment and theme stuff
  scale_y_continuous(labels = function(var5) paste0(var5*100, "%"),
                     limits=c(0,1),
                     breaks=c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)) +
  
  theme(panel.background = element_blank(),
                axis.line = element_line(colour = "#000000"),
                axis.text.x = element_text(angle=60, hjust=1),
                panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                axis.title.x= (element_text(margin = unit(c(3, 0, 0, 0), "mm"))),
                legend.position = "top")

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章