gpt4 book ai didi

r - ggplot2:使用图例制作多行+功能区

转载 作者:行者123 更新时间:2023-12-04 08:44:36 26 4
gpt4 key购买 nike

我想在 ggplot2 中绘制一个图

  • 多行,
  • 每个都有一个环绕的丝带,
  • 用户指定颜色,
  • 并带有显示线条颜色和色带颜色的图例。

  • (向下滚动以查看几乎实现我所寻求的情节的示例。)
    我看过相关的问题,但没有一个问题能一起解决所有这些问题,我在网上找了一些例子,但找不到这样的例子。我是 ggplot2 的新手,因此对这样一个基本问题表示歉意,但也许您的回答也会对其他人有所帮助。
    这是一个非常不雅的完整示例,试图拼凑出几乎可以实现我想要的图形。我已经尝试过使用宽格式数据和长格式数据。 (是的,我使用 = 而不是 <- ,我不使用很多推荐的空格,但这些是单独的问题...... :-)
    # Housekeeping:
    graphics.off()
    library("ggplot2")
    library("tidyr") # for pivot_longer()

    # Set up data:
    set.seed(47405)
    x = 1:10
    y1 = 1 + 0.1*x + rnorm(length(x),0,0.2) # line 1
    y2 = 2 + 0.2*x + rnorm(length(x),0,0.2) # line 2
    y1lo = y1 - 0.2 # ribbon 1 low
    y1hi = y1 + 0.2 # ribbon 1 high
    y2lo = y2 - 0.3 # ribbon 2 low
    y2hi = y2 + 0.3 # ribbon 2 high

    # Wide format data frame:
    wideDF = data.frame( x=x ,
    y1lo=y1lo , y1=y1 , y1hi=y1hi ,
    y2lo=y2lo , y2=y2 , y2hi=y2hi )

    # Long format data frame:
    longDF = pivot_longer( wideDF , cols=!x , names_to="line" , values_to="y" )
    longDF$fill = NA
    longDF$fill[grep( "1" , longDF$line )] = "y1"
    longDF$fill[grep( "2" , longDF$line )] = "y2"
    使用宽格式但没有图例的不雅方式:
    ggplot( wideDF , aes(x=x) ) +
    geom_ribbon( aes( ymin=y1lo , ymax=y1hi ) , fill="pink" , alpha=0.5 ) +
    geom_line( aes( y=y1 ) , col="red" ) +
    geom_ribbon( aes( ymin=y2lo , ymax=y2hi ) , fill="lightblue" , alpha=0.5 ) +
    geom_line( aes( y=y2 ) , col="blue" ) +
    labs( title="Using WIDE data frame" , y="Y label" , x="X label" ) +
    geom_text( x = max(wideDF$x) ,
    y = wideDF$y1[wideDF$x==max(wideDF$x)] ,
    hjust = 1 , vjust = -0.5 ,
    label="Y1" , color = "red" ) +
    geom_text( x = max(wideDF$x) ,
    y = wideDF$y2[wideDF$x==max(wideDF$x)] ,
    hjust = 1 , vjust = -0.5 ,
    label="Y2" , color = "blue" )
    enter image description here
    使用长格式的不优雅方式,仍然没有图例:
    ggplot( ) + 
    xlim(range(longDF$x)) + ylim(range(longDF$y)) +
    geom_ribbon( aes( x=longDF$x[longDF$line=="y1"] ,
    ymin=longDF$y[longDF$line=="y1lo"] ,
    ymax=longDF$y[longDF$line=="y1hi"] ),
    fill="pink" , alpha=0.5 ) +
    geom_line( aes( x=longDF$x[longDF$line=="y1"] ,
    y=longDF$y[longDF$line=="y1"] ) ,
    color="red" ) +
    geom_ribbon( aes( x=longDF$x[longDF$line=="y2"] ,
    ymin=longDF$y[longDF$line=="y2lo"] ,
    ymax=longDF$y[longDF$line=="y2hi"] ),
    fill="lightblue" , alpha=0.5 ) +
    geom_line( aes( x=longDF$x[longDF$line=="y2"] ,
    y=longDF$y[longDF$line=="y2"] ) ,
    color="blue" ) +
    labs( title="Using LONG data frame" , y="Y label" , x="X label" ) +
    geom_text( aes(
    x = max(longDF$x) ,
    y = longDF$y[longDF$x==max(longDF$x) & longDF$line=="y1"] ) ,
    hjust = 1 , vjust = -0.5 ,
    label="Y1" , color = "red" ) +
    geom_text( aes( x = max(longDF$x) ,
    y = longDF$y[longDF$x==max(longDF$x) & longDF$line=="y2"] ) ,
    hjust = 1 , vjust = -0.5 ,
    label="Y2" , color = "blue" )
    enter image description here
    所以,我的问题:
  • 如何有效地编码多个线+带图?上面的代码非常不优雅,而且我显然缺少关于 aes() 的基本概念。和 data=在 ggplot2 中。答案不仅显示代码,还简要解释了 aes() 的情况会很棒。
  • 如何在这些图中添加图例? (当然,对于图例,不需要上面示例中的 geom_text() 元素。)
  • 对于 ggplot 中的多行 + 带状图,使用宽格式或长格式数据框更有用吗?

  • 谢谢!

    最佳答案

    也许这就是你正在寻找的......

  • 一般类(class):如果你想要一个图例,你必须在美学上映射一些东西,即输入 color和/或 fillaes()
  • 您的宽数据集和长数据集都不适合轻松绘图。相反,从你的长 df 开始,我首先去掉你行列中的数字并使数据集更宽,所以我们只有 y , ymin , ymax (这样做之后,我们最终得到了整洁的数据,因为 1 和 2 是一个变量的类别,而 y、ymin、ymax 是不同的变量)。这允许我们仅使用两个几何层来设置您的绘图。此外,我们不必使用复杂且容易出错的代码,如 longDF$x[longDF$line=="y2"]获得我们喜欢绘制的值。
  • 对于文本标签,我使用 group_by(longDF1, fill) %>% top_n(1, x)作为数据,它只是为每一行选择具有最高 x 值的行。
  • 最后,为了获得正确的颜色,请通过 scale_xxx_manual 设置它们

  • library(dplyr)
    library("ggplot2")
    library("tidyr") # for pivot_longer()

    # Set up data:
    set.seed(47405)
    x = 1:10
    y1 = 1 + 0.1*x + rnorm(length(x),0,0.2) # line 1
    y2 = 2 + 0.2*x + rnorm(length(x),0,0.2) # line 2
    y1lo = y1 - 0.2 # ribbon 1 low
    y1hi = y1 + 0.2 # ribbon 1 high
    y2lo = y2 - 0.3 # ribbon 2 low
    y2hi = y2 + 0.3 # ribbon 2 high

    # Wide format data frame:
    wideDF = data.frame( x=x ,
    y1lo=y1lo , y1=y1 , y1hi=y1hi ,
    y2lo=y2lo , y2=y2 , y2hi=y2hi )

    # Long format data frame:
    longDF = pivot_longer( wideDF , cols=!x , names_to="line" , values_to="y" )
    longDF$fill = NA
    longDF$fill[grep( "1" , longDF$line )] = "y1"
    longDF$fill[grep( "2" , longDF$line )] = "y2"

    longDF1 <- longDF %>%
    mutate(line = gsub("\\d", "", line)) %>%
    pivot_wider(id_cols = c(x, fill), names_from = line, values_from = y)

    ggplot(longDF1) +
    geom_ribbon(aes(x=x, ymin=ylo, ymax=yhi, fill = fill), alpha=0.5) +
    geom_line(aes(x=x, y=y, color = fill)) +
    labs( title="Using LONG data frame" , y="Y label" , x="X label" ) +
    geom_text(data = group_by(longDF1, fill) %>% top_n(1, x),
    aes(x = x, y = y, label = toupper(fill), color = fill),
    hjust = 1 , vjust = -0.5, show.legend = FALSE) +
    scale_color_manual(values = c(y1 = "red", y2 = "blue")) +
    scale_fill_manual(values = c(y1 = "pink", y2 = "lightblue"))

    关于r - ggplot2:使用图例制作多行+功能区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64391103/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com