簡體   English   中英

難以獲得混合線a和指向ggplot2中顏色和形狀的點圖例

[英]Difficulty getting a mixed line a and point legend that specifies colour and shape in ggplot2

所以我一直在努力為這個情節找到一個正確的傳奇。 我的最終目標是顯示線條顏色和點顏色的圖例。 我可以讓傳說中的線條工作正常,但是想知道我也是如何得到點數(包括點的形狀顏色)? 任何工作或建議非常感謝!

Tempx<-c(20, 22, 24, 26, 28, 30, 32, 34)
Tempx<-rep(Tempx,2)


Temp<-rnorm(1000,28,2)
var1<-rnorm(1000,25,5)
Data<-data.frame(Temp,var1)

Temp<-rnorm(1000,28,2)
var1<-rnorm(1000,12,5) 
Data2<-data.frame(Temp,var1)

a1<-1.05*Tempx
a2<-0.5*Tempx
a1low<-0.95*Tempx
a1high<-1.15*Tempx
a2low<-0.4*Tempx
a2high<-0.6*Tempx


plot1<-ggplot(NULL, aes(Temp, var1)) + 
  geom_point(data = Data, colour="grey60", size=1.5, shape=1, show.legend=TRUE) +
  geom_point(data = Data2, shape= 16, size=1, show.legend=TRUE) +
  geom_line(aes(x=Tempx,y=a1, colour="grey50"), size=1.75, show.legend=TRUE) +
  geom_line(aes(x=Tempx,y=a2, colour="black"), size=1.75, show.legend=TRUE) +
  geom_line(aes(x=Tempx,y=a1low), colour="grey50",size=1.25, linetype="longdash") +
  geom_line(aes(x=Tempx,y=a1high), colour="grey50",size=1.25, linetype="longdash") +
  geom_line(aes(x=Tempx,y=a2low), colour="black",size=1.25, linetype="longdash") +
  geom_line(aes(x=Tempx,y=a2high), colour="black",size=1.25, linetype="longdash") +
  scale_shape_manual(values=c(1, 16)) +
  scale_color_manual(labels = c("low", "high"), values=c('black','grey50')) +
  theme_bw()+
  theme(axis.line.x = element_line(colour = "black"),
        axis.line.y = element_line(colour = "black"),
        axis.text.x = element_text(margin=unit(c(0.4,0.4,0.4,0.4), "cm")), 
        axis.text.y = element_text(margin=unit(c(0.4,0.4,0.4,0.4), "cm")),
        axis.title.x = element_text(margin = margin(t = -6)),
        axis.title.y = element_text(margin = margin(t = -6)),
        axis.text=element_text(size=13),
        text = element_text(size=14),
        plot.title = element_text(size=16, hjust=0),
        axis.ticks.length = unit(-0.1,"cm"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_x_continuous(name = "Temperature", breaks = c(20, 22, 24, 26, 28, 30, 32, 34), expand=c(0,0), limits=c(20,34))+
  scale_y_continuous(name = "Variable 1", expand = c(0, 0), limits = c(0, 40)) +
  ggtitle("Title")

plot1

您可以通過將數據從寬格式轉換為長格式來顯着縮短代碼。 那么你只需要調用geom_pointgeom_line下面就是一個例子。 dat1dat2包含點和主線。 dat1已經是長格式。 我們也將dat2轉換為dat2long 我把dat3long放在一個單獨的數據框中,因為我們不需要將這些值映射到一個產生圖例的美學。 因此,我對這些線使用了單獨的geom_line調用,並且我對顏色進行了硬編碼。

library(tidyverse)

# Create long data frame for point data
dat1 = bind_rows(list(a1=Data, a2=Data2), .id="Source")

# Create long data frames for lines data
dat2 = data.frame(Tempx, a1, a2)
dat3 = data.frame(Tempx, a1low, a1high, a2low, a2high)
dat2long = dat2 %>% gather(Source, value, -Tempx)
dat3long = dat3 %>% gather(Source, value, -Tempx)

ggplot() +
  geom_point(data=dat1, aes(Temp, var1, shape=Source, colour=Source)) +
  geom_line(data=dat2long, aes(x=Tempx, y=value, colour=Source)) +
  geom_line(data=dat3long, aes(x=Tempx, y=value, group=Source), linetype=2, 
            colour=rep(c("red","blue"), each=2*length(Tempx))) +
  scale_colour_manual(values=c("red","blue")) +
  theme_bw()

在此輸入圖像描述

如果您的目標是繪制置信區間,則可以執行以下操作:

ggplot(data=dat1, aes(Temp, var1, shape=Source, fill=Source, colour=Source)) +
  geom_point() +
  geom_smooth(method='lm') +
  theme_bw()

在此輸入圖像描述

正如評論中所建議的那樣:讓我們從清理數據框開始:

Temp<-rnorm(1000,28,2)
Data1<-data.frame(Temp,var = rnorm(1000,25,5), group = rep ('a', 1000)) ##adding groups
Data2<-data.frame(Temp,var = rnorm(1000,12,5), group = rep ('b', 1000))

data = rbind(Data1, Data2 )

現在清理你的ggplot電話

一條建議:

ggplot(data, aes(Temp, var, color = group )) + 
geom_point(size=1.5, shape=1) + 
geom_smooth(method = 'lm') #(maybe this model is what you want anyways)

在此輸入圖像描述

這有點亂,但我認為它做你想要的。 對不起怪異的顏色,我只是從colorbrewer拉了一些。

library(ggplot2)

Tempx<-c(20, 22, 24, 26, 28, 30, 32, 34)
Tempx<-rep(Tempx,2)


Temp<-rnorm(1000,28,2)
var1<-rnorm(1000,25,5)
var2<-rnorm(1000,12,5) 

a1<-1.05*Tempx
a2<-0.5*Tempx
a1low<-0.95*Tempx
a1high<-1.15*Tempx
a2low<-0.4*Tempx
a2high<-0.6*Tempx


dat1 <- data.frame(Temp,  var1, var2)
dat2 <- data.frame(Tempx, a1, a2, a1low, a1high, a2low, a2high)


plot2 <- ggplot() +
geom_point(data=dat1,aes(x=Temp,y=var1, colour="var1", size=1.5)) +
geom_point(data=dat1,aes(x=Temp, y=var2, colour="var2", size=1)) +
geom_line(data=dat2,aes(x=Tempx, y=a1, colour="a1"), size=1.75) +
geom_line(data=dat2,aes(x=Tempx,y=a2, colour="a2"), size=1.75) +
geom_line(data=dat2,aes(x=Tempx,y=a1low, colour="black",size=1.25, linetype="longdash")) +
geom_line(data=dat2,aes(x=Tempx,y=a1high, colour="black",size=1.25, linetype="longdash")) +
geom_line(data=dat2,aes(x=Tempx,y=a2low, colour="black",size=1.25, linetype="longdash")) +
geom_line(data=dat2,aes(x=Tempx,y=a2high, colour="black",size=1.25, linetype="longdash")) +
scale_color_manual("",
    breaks = c("var1", "var2", "a1", "a2", "a1low", "a1high", "a2low", "a2high"), 
    values=c("#762a83", "#af8dc3","#e7d4e8","#f7f7f7","#d9f0d3","#7fbf7b","#1b7837", "#000000")) +
scale_size(guide = "none")+
guides(size="none", linetype="none")+ #removes linetype and sizes from legend
theme_bw()

:)

你實際上與scale_shape_manualscale_colour_manual調用非常接近。 缺少的成分是將兩組點的形狀放入geom_point的映射中,就像你在geom_line為顏色geom_line

library(ggplot2)

plot2 <- ggplot(mapping=aes(x=Temp, y=var1)) +

  geom_point(data=Data, mapping=aes(shape="high"), colour="grey50", size=1.5) +
  geom_point(data=Data2, mapping=aes(shape="low")) +
  scale_shape_manual(
    values=c(1, 16),
    guide=guide_legend(
      title="Legend: Points",
      override.aes=list(
        colour=c("grey50", "black"),
        size=c(1.5, 1)
      )
    )
  ) +

  geom_line(mapping=aes(x=Tempx, y=a1, colour="high"), size=1.75) +
  geom_line(mapping=aes(x=Tempx, y=a2, colour="low"), size=1.75) +
  scale_colour_manual(values=c("grey50", "black"), guide=guide_legend(title="Legend: Lines")) +

  geom_line(mapping=aes(x=Tempx, y=a1low), colour="grey50", size=1.25, linetype="longdash") +
  geom_line(mapping=aes(x=Tempx, y=a1high), colour="grey50", size=1.25, linetype="longdash") +
  geom_line(mapping=aes(x=Tempx, y=a2low), colour="black", size=1.25, linetype="longdash") +
  geom_line(mapping=aes(x=Tempx, y=a2high), colour="black", size=1.25, linetype="longdash") +

  theme_bw() +
  theme(axis.line.x=element_line(colour="black"),
        axis.line.y=element_line(colour="black"),
        axis.text.x=element_text(margin=unit(c(0.4, 0.4, 0.4, 0.4), "cm")), 
        axis.text.y=element_text(margin=unit(c(0.4, 0.4, 0.4, 0.4), "cm")),
        axis.title.x=element_text(margin=margin(t=-6)),
        axis.title.y=element_text(margin=margin(t=-6)),
        axis.text=element_text(size=13),
        text=element_text(size=14),
        plot.title=element_text(size=16, hjust=0),
        axis.ticks.length=unit(-0.1,"cm"),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.border=element_blank(),
        panel.background=element_blank()) +
  scale_x_continuous(name="Temperature", breaks=c(20, 22, 24, 26, 28, 30, 32, 34), expand=c(0, 0), limits=c(20, 34)) +
  scale_y_continuous(name="Variable 1", expand=c(0, 0), limits=c(0, 40)) +
  ggtitle("Title")

上面的代碼給出了一個帶有兩個單獨圖例的圖表,一個用於點,一個用於線:

帶有兩個獨立圖例的情節,一個用於點,一個用於線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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