R语言 ggplot用y值着色的多条线

hyrbngr7  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(156)

我想生成一个类似于此图的图形,但数据点上的符号更大,由其y轴值着色:

下面是一个使用我尝试过的代码的“最小示例”:

library(ggplot2)
strtT <- Sys.time()-30*(24*3600);
endT <- Sys.time()-24*3600
xAxis <- seq(from=strtT,to=endT,by=24*3600)

dat <- data.frame(x = xAxis, 
                  y1 = rnorm(length(xAxis),mean=40,sd=30),
                  lab = "Y1")
fulldat <- dat;
dat <- data.frame(x = xAxis, 
                  y1 = rnorm(length(xAxis),mean=15,sd=5),
                  lab = "Y2")
fulldat <- rbind(fulldat,dat);
dat <- data.frame(x = xAxis, 
                  y1 = rnorm(length(xAxis),mean=80,sd=10),
                  lab = "Y3")
fulldat <- rbind(fulldat,dat);

gp<-ggplot(fulldat, aes(x,y1,color=y1)) + 
  # geom_point(aes(shape=(factor(lab)),size=6),show.legend=FALSE) +
  geom_point(aes(shape=(factor(lab)),size=6)) +
  # geom_line(aes(x,y1,linewidth=1.5,color=(14+as.numeric(factor(lab))))) +
  geom_line(aes(group=factor(lab)),linewidth=1.0) +
  scale_color_gradientn(colours=c("blue","gray80","red"), limits=c(0,max(dat$y1)),
                        breaks=c(15,30,45,60,75,90,110), 
                        labels=c(1,2,3,4,5,6,7), 
                        na.value = "green",
                        guide=guide_colorbar(nbin=10, raster=F, barwidth=2, frame.colour=c("black"),
                                             frame.linewidth=1, ticks.colour="black")) +
  theme(legend.position = "right") 
gp

我无法解决的最大问题是,我希望线由变量“lab”着色,而Y1数据作为数据点,由其y轴值着色。在本例中,数据点和线都由y轴值着色。似乎无法将两者分开。
另一个问题是改善图例的外观。颜色条应该是全高的,线条样式的图例(实验室变量)应该在颜色条旁边,而不是下面。还有那个图例条目是什么,上面写着大小和一个实心点和'6'??我可以摆脱它吗?

gkl3eglg

gkl3eglg1#

一般来说,在ggplot2中,每个美学都有一个比例,即您只能有一个color比例。克服这个问题的一个选择是使用ggnewscale包,该包允许每个美学有多个比例。因此,在geom_point中将y1Map到color,然后为y1添加scale_color_gradientn。然后通过ggnewscale::new_scale_color()添加新的色标,并添加线条和所需的颜色(在示例代码中,我通过scale_color_brewer添加了一个brewer pal:

library(ggplot2)
library(ggnewscale)

ggplot(fulldat, aes(x, y1)) +
  geom_point(aes(shape = lab, color = y1), size = 6) +
  scale_color_gradientn(
    colours = c("blue", "gray80", "red"), limits = c(0, max(dat$y1)),
    breaks = c(15, 30, 45, 60, 75, 90, 110),
    labels = c(1, 2, 3, 4, 5, 6, 7),
    na.value = "green",
    guide = guide_colorbar(
      nbin = 10, raster = F, barwidth = 2, frame.colour = c("black"),
      frame.linewidth = 1, ticks.colour = "black"
    )
  ) +
  ggnewscale::new_scale_color() +
  geom_line(aes(group = lab, color = lab), linewidth = 1.0) +
  scale_color_brewer(palette = "Set1") +
  theme(legend.position = "right")

相关问题