r - ggplot 融化了数据共享共同的美学

标签 r ggplot2 ggnewscale

我需要从混合了三个几何图形的融化 data.table 中绘制图形:geom_linegeom_colgeom_pointgeom_linegeom_point 共享 color 美学:

set.seed(1)
time <- 1:10
mag  <- 10:20
q_mag <- c("up", "up", "down")
l_a  <- sample(1:12, 10)
l_b  <- sample(8:20, 10)
p_a  <- sample(1:12, 10)
p_b  <- sample(8:20, 10)

dt <- data.table(time, mag, q_mag, l_a, l_b, p_a, p_b)
dt <- melt(dt, measure.vars = c("mag", "l_a", "l_b", "p_a", "p_b"))


ggplot(data = dt, aes (x = time)) +
  geom_col( data = dt[variable %in% "mag"]
          , aes( y    = value
               , fill = q_mag)) +
  
  scale_fill_grey(start = .4) +
  
  geom_line( data = dt[variable %in% c("l_a", "l_b")]
            ,aes( y = value
                , color = variable)
            ,size =1) +
  
  geom_point( data = dt[variable %in% c("p_a", "p_b")]
             ,aes( y = value
                  ,color = variable
                  ,size = variable
                  ,shape = variable)) +

  scale_shape_manual( name = element_blank() 
                    , labels = c("Point A", "Point B")
                    , values = c("circle", "cross")
  )+    
  
  scale_size_manual( name = element_blank() 
                   , labels = c("Point A", "Point B")
                   , values = c(4,2)
  )+    
  
  scale_color_manual( name = element_blank()
                    , labels = c("Line A", "Line B", "Point A", "Point B")
                    , values = c("red", "green", "red", "blue")
  )

此代码按预期绘制图表: enter image description here

但是,我希望以另一种方式呈现图例:

  • A 点为一个大红色圆圈,
  • B 点 作为一个蓝色小十字,
  • A 线 为红色直线(无点),并且
  • B 线 为绿色直线(无点)。

如何实现所需的图例?

最佳答案

这可以通过允许多种色阶的ggnewscale包轻松实现:

library(ggplot2)
library(data.table)
library(reshape2)
library(ggnewscale)

set.seed(1)
time <- 1:10
mag <- 10:20
q_mag <- c("up", "up", "down")
l_a <- sample(1:12, 10)
l_b <- sample(8:20, 10)
p_a <- sample(1:12, 10)
p_b <- sample(8:20, 10)

dt <- data.table(time, mag, q_mag, l_a, l_b, p_a, p_b)
dt <- melt(dt, measure.vars = c("mag", "l_a", "l_b", "p_a", "p_b"))

dt <- as.data.table(dt)

ggplot(data = dt, aes(x = time, y = value)) +
  geom_col(
    data = dt[variable %in% "mag"],
    aes(
      fill = q_mag
    )
  ) +
  geom_point(
    data = dt[variable %in% c("p_a", "p_b")],
    aes(
      color = variable,
      size = variable,
      shape = variable
    )
  ) +
  scale_fill_grey(start = .4) +
  scale_shape_manual(
    name = element_blank(),
    labels = c("Point A", "Point B"),
    values = c("circle", "cross")
  ) +
  scale_size_manual(
    name = element_blank(),
    labels = c("Point A", "Point B"),
    values = c(4, 2)
  ) +
  scale_color_manual(
    name = element_blank(),
    labels = c("Point A", "Point B"),
    values = c("red", "blue")
  ) + 
  new_scale_color() +
  geom_line(
    data = dt[variable %in% c("l_a", "l_b")],
    aes(
      color = variable
    ), size = 1
  ) +
  scale_color_manual(
    name = element_blank(),
    labels = c("Line A", "Line B"),
    values = c("red", "green")
  )

关于r - ggplot 融化了数据共享共同的美学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65930458/

相关文章:

r - R 中日期重叠的按天求和的时间间隔数据

r - 将列中的独特特征转换为变量名称并将原始特征虚拟编码为 R 中的变量

html - 使滚动条出现在 RMarkdown 代码块中(html View )

r - 一起使用facet_grid和facet_wrap

r - 水平对齐图例ggplot2

r - 当我使用 ggnewscale 包创建多个比例时如何更改图例标题位置?

r - 如何让 R 使用更多的 CPU 和内存?

r - 在 gWidgetsRGtk2 中使用 ggplot2

r - ggplot和pivot_longer对多个因素的影响

r - 在 ggplot 的图例中添加背景透明度和自定义排序