我使用以下代码绘制2 geom_point图:
source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
ggplot() +
geom_point(aes(x = year,y = boys),data=arbuthnot,colour = '#3399ff') +
geom_point(aes(x = year,y = girls),data=arbuthnot,shape = 17,colour = '#ff00ff') +
xlab(label = 'Year') +
ylab(label = 'Rate')
我只是想知道如何在右侧添加图例。具有相同的形状和颜色。三角粉色应该有传说"女人"和蓝色圈出传说" men"。看起来很简单但经过多次试验我无法做到。 (我是ggplot的初学者)。
答案 0 :(得分:16)
如果重命名原始数据框的列,然后使用reshape2::melt
将其融合为长格式,则在ggplot2中处理起来要容易得多。通过在ggplot命令中指定color
和shape
美学,并手动指定颜色和形状的比例,将显示图例。
source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
library(reshape2)
names(arbuthnot) <- c("Year", "Men", "Women")
arbuthnot.melt <- melt(arbuthnot, id.vars = 'Year', variable.name = 'Sex',
value.name = 'Rate')
ggplot(arbuthnot.melt, aes(x = Year, y = Rate, shape = Sex, color = Sex))+
geom_point() + scale_color_manual(values = c("Women" = '#ff00ff','Men' = '#3399ff')) +
scale_shape_manual(values = c('Women' = 17, 'Men' = 16))
答案 1 :(得分:6)
这是一种不使用reshape :: melt的方法。 reshape :: melt工作,但如果你想在图表中添加其他东西,你可以进入绑定,例如线段。下面的代码使用原始数据组织。修改图例的关键是确保scale_color_manual(...)和scale_shape_manual(...)的参数相同,否则你会得到两个图例。
source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
library(reshape2)
ptheme <- theme (
axis.text = element_text(size = 9), # tick labels
axis.title = element_text(size = 9), # axis labels
axis.ticks = element_line(colour = "grey70", size = 0.25),
panel.background = element_rect(fill = "white", colour = NA),
panel.border = element_rect(fill = NA, colour = "grey70", size = 0.25),
panel.grid.major = element_line(colour = "grey85", size = 0.25),
panel.grid.minor = element_line(colour = "grey93", size = 0.125),
panel.margin = unit(0 , "lines"),
legend.justification = c(1, 0),
legend.position = c(1, 0.1),
legend.text = element_text(size = 8),
plot.margin = unit(c(0.1, 0.1, 0.1, 0.01), "npc") # c(bottom, left, top, right), values can be negative
)
cols <- c( "c1" = "#ff00ff", "c2" = "#3399ff" )
shapes <- c("s1" = 16, "s2" = 17)
p1 <- ggplot(data = arbuthnot, aes(x = year))
p1 <- p1 + geom_point(aes( y = boys, color = "c1", shape = "s1"))
p1 <- p1 + geom_point(aes( y = girls, color = "c2", shape = "s2"))
p1 <- p1 + labs( x = "Year", y = "Rate" )
p1 <- p1 + scale_color_manual(name = "Sex",
breaks = c("c1", "c2"),
values = cols,
labels = c("boys", "girls"))
p1 <- p1 + scale_shape_manual(name = "Sex",
breaks = c("s1", "s2"),
values = shapes,
labels = c("boys", "girls"))
p1 <- p1 + ptheme
print(p1)
答案 2 :(得分:2)
答案 3 :(得分:0)
以下是基于tidyverse
软件包的答案。可以使用管道%>%
将功能链接在一起的地方。以一种继续的方式创建图,无需创建临时变量。可以在此帖子What does %>% function mean in R?
据我所知,ggplot2中的图例仅基于美学变量。因此,要添加离散的图例,可以使用类别列,并根据类别更改外观。在ggplot中,此操作例如由aes(color=category)
完成。
因此,要将数据框的两个(或多个)不同变量添加到图例中,一个需要转换数据框,以便我们有一个类别列告诉我们正在绘制哪一列(变量),而第二列真正拥有价值。也由tidyr::gather
加载的tidyverse
函数可以做到这一点。
然后只需指定哪些美学变量需要不同即可创建图例。在此示例中,代码如下所示:
source("http://www.openintro.org/stat/data/arbuthnot.R")
library(tidyverse)
arbuthnot %>%
rename(Year=year,Men=boys,Women=girls) %>%
gather(Men,Women,key = "Sex",value = "Rate") %>%
ggplot() +
geom_point(aes(x = Year, y=Rate, color=Sex, shape=Sex)) +
scale_color_manual(values = c("Men" = "#3399ff","Women"= "#ff00ff")) +
scale_shape_manual(values = c("Men" = 16, "Women" = 17))
请注意,tidyverse
软件包也会自动加载到ggplot2
软件包中。可以在其网站tidyverse.org上找到已安装软件包的概述。
在上面的代码中,我还使用了dplyr::rename
函数(也由tidyverse
加载)首先将列重命名为所需标签。由于图例会自动使用等于类别名称的标签。
还有另一种重命名图例标签的方法,该方法涉及通过scale_aesthetic_manual
参数在labels =
函数中显式指定标签。有关示例,请参见legends cookbook。但不建议这样做,因为它会随着更多的变量而迅速变得混乱。