R 组合ggplot geom_点和geom_线图生成的冗余图例

R 组合ggplot geom_点和geom_线图生成的冗余图例,r,ggplot2,legend,R,Ggplot2,Legend,我试图用geom_point和errorbars演示两个组之间的差异,并通过geom_线将它们链接起来,这样就很容易了解链接的组。自动生成的图例包含两个面板,一个用于点,一个用于线。我已经搜索了“合并传奇”和“冗余传奇”以及许多其他内容,并且已经接近一两次,但似乎无法解决我的问题。我希望有一个图例同时显示点和线类型,但我愿意放弃线图例并显示点。就代码而言,我是个新手,所以如果你能找到提高效率的方法,我很乐意学习。谢谢你的帮助 dat <- structure(list(pop = stru

我试图用geom_point和errorbars演示两个组之间的差异,并通过geom_线将它们链接起来,这样就很容易了解链接的组。自动生成的图例包含两个面板,一个用于点,一个用于线。我已经搜索了“合并传奇”和“冗余传奇”以及许多其他内容,并且已经接近一两次,但似乎无法解决我的问题。我希望有一个图例同时显示点和线类型,但我愿意放弃线图例并显示点。就代码而言,我是个新手,所以如果你能找到提高效率的方法,我很乐意学习。谢谢你的帮助

dat <- structure(list(pop = structure(c(1L, 1L, 2L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), foundlost = structure(c(1L, 2L, 
1L, 2L, 1L, 2L), .Label = c("Found", "Lost"), class = "factor"), 
mean = c(3.939, -7.153, 3.001, -4.089, 4.247, -5.168), sd = c(4.394, 
9.08, 4.627, 6.644, 5.346, 6.592), Freq = c(118L, 65L, 109L, 
80L, 202L, 166L), error = c(0.792806386453774, 2.20738080265164, 
0.868629033901147, 1.4559039398977, 0.737227217957054, 1.00279288913615
), Edn = c(3.14619361354623, -9.36038080265164, 2.13237096609885, 
-5.5449039398977, 3.50977278204295, -6.17079288913615), Eup = c(4.73180638645377, 
-4.94561919734836, 3.86962903390115, -2.6330960601023, 4.98422721795705, 
-4.16520711086385)), .Names = c("pop", "foundlost", "mean", 
"sd", "Freq", "error", "Edn", "Eup"), class = "data.frame", row.names = c(NA, -6L))
dat

attach(dat)
require(ggplot2)
pd <- position_dodge(.2)


mainplot <- ggplot(data=dat, aes(x=foundlost, y=mean, ymin=Edn, ymax=Eup, linetype=NULL, group=pop)) +
geom_point(aes(shape=pop), size=4, position=pd)+
geom_errorbar(width=0.2, size=1.25, position=pd)+
geom_line(position=pd, size=1.25, aes(group=pop, linetype=pop))

phase2 <- mainplot +
scale_shape_discrete(name="", labels= c("ONE", "TWO", "TREE"))+
scale_x_discrete(expand=c(0.1,0.1)) +
labs(title="Mean standardized differences",
        y="Deviation from population mean",
        x="")

phase2 + 
theme(plot.title=element_text(size=rel(1.5)), 
panel.background=element_blank(),
axis.line=element_line(1.5),
panel.grid=element_blank(), 
axis.text=element_text(colour='black', size=14), 
axis.title.y=element_text(colour='black', size=14),
axis.ticks=element_line(colour='black', size=1),
legend.position=c(.2,.25),

complete=FALSE)

dat你的传奇在这里发生了几件事

首先,由于整个绘图
aes
中的
linetype=NULL
参数,您得到了两个图例。删除这两个图例,一开始就可以去掉这两个图例。但是使用
scale\u shape\u discrete
再次添加第二个图例。如果要以这种方式更改图例标签并使用单个图例,则需要同时使用
scale\u shape\u discrete
scale\u linetype\u discrete
。在的图例页上有一个很好的例子

我认为更改图例标签最简单的方法之一是在绘图之前简单地在数据集中设置因子
pop
的级别

levels(dat$pop) = c("ONE", "TWO", "THREE")
如果使用组合图例,则可能需要更改图例的宽度以更好地显示线型,这可以在
guides
中使用
guides\u legend
keywidth
执行,如下所示

ggplot(data=dat, aes(x=foundlost, y=mean, ymin=Edn, ymax=Eup, group=pop)) +
    geom_point(aes(shape=pop), size=4, position=pd) +
    geom_errorbar(width=0.2, size=1.25, position=pd) +
    geom_line(position=pd, size=1, aes(group=pop, linetype=pop)) +
    scale_x_discrete(expand=c(0.1,0.1)) +
    labs(title="Mean standardized differences",
        y="Deviation from population mean",
        x="") + 
    theme(plot.title=element_text(size=rel(1.5)), 
         panel.background=element_blank(),
         axis.line=element_line(1.5),
         panel.grid=element_blank(), 
         axis.text=element_text(colour='black', size=14), 
         axis.title.y=element_text(colour='black', size=14),
         axis.ticks=element_line(colour='black', size=1),
         legend.position=c(.2,.25)) +
    guides(shape = guide_legend(keywidth = 2))
要删除
线型
图例,请在添加
geom_线
图层时使用
show.legend=FALSE

ggplot(data=dat, aes(x=foundlost, y=mean, ymin=Edn, ymax=Eup, group=pop)) +
    geom_point(aes(shape=pop), size=4, position=pd) +
    geom_errorbar(width=0.2, size=1.25, position=pd) +
    geom_line(position=pd, size=1, aes(group=pop, linetype=pop), show_guide = FALSE)

谢谢你的快速回复。似乎所有的事情都能让我达到目的,但当我像你所发布的那样把它放在一起运行时,有一个未闭合的括号。当我关闭它时,我抛出错误:“c(0.2,0.25)+指南中的错误(shape=guide_legend(keywidth=2)):二进制运算符的非数字参数”。我玩过它,如果我只运行ggplot和guides调用,那部分就行了,但是当我尝试调整主题时,它似乎出错了。再次感谢。你们的服务真是太棒了。@a.Birdman啊,是的,我在编辑的时候掉了一个括号。我又玩了一会儿,发现只需在ggplot和themes之间定位guides()调用,就可以运行得很好。