我希望有一个图例,其中包括对所有颜色的引用,而不仅仅是垂直线,并且不包括标题。
我试过 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")
这里有很多东西可以打开,但我尽力了。
首先,请考虑您要在这里绘制什么。通常,调用 things 不是问题var1, var2, var3,...
;然而,在这种情况下,它真的很令人困惑。因此,对于此解决方案,出于我希望在此答案中概述的原因,我将重新发布您重新设计的整个代码,而不仅仅是绘图部分。
综上所述,以下是我对数据集的性质以及您对最终图的渴望的理解:
var2
数据集中包含Date
类信息,这是x
整个图的公共轴。
var1
包含用于绘图层y
值的值geom_line
var3
并var4
包含用于创建堆叠条形图的值,该条形图应构成图的背景
var5
是 的总和var3 + var4
,并且是创建情节的设备。在这里,考虑到我们要对数据集进行数据分析和 Tidy Data 原则的应用,它不会有用。
xintercept
geom_vline
绘图层的值作为两个日期提供new_dates
OP 的问题表明需要正确显示图例。在这种情况下,我们要指出:
var3
和var4
geom_line
绘图层的标签。假设标签是var1
。希望一切都是正确的!
我鼓励 OP 参考Tidy Data 原则的使用,这将使将来对此类数据的合成更加简单。在这里,我将把这些原则应用到数据集上dat
。
首先,让我们处理条形层数据。应用整洁数据的原则,我们将要聚集在一起var3
,并var4
和他们创造出两列:(1)一个用于命名变量(中"var3"
或"var4"
),和(2)一项价值。我们将告诉ggplot2
“堆叠”柱,所以var5
这里不需要:ggplot2
将自动进行计算。要将列收集在一起,我的首选始终是使用gather()
fromdplyr
和tidyr
:
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
。
您还可以创建一个单独的数据集,其中包含var2
并var1
用于绘制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] 删除。
我来说两句