gpt4 book ai didi

R - ggplot 躲避 geom_lines

转载 作者:行者123 更新时间:2023-12-04 19:01:44 29 4
gpt4 key购买 nike

这是我一直在尝试寻找修复方法的事情,但基本上我想知道是否有一种快速的方法来“躲避”ggplot2中两个不同数据集的线图。
我的代码目前是:

#Example data
id <- c("A","A")
var <- c(1,10)
id_num <- c(1,1)
df1 <- data.frame(id,var,id_num)

id <- c("A","A")
var <- c(1,15)
id_num <- c(0.9,0.9)
df2 <- data.frame(id,var,id_num)


#Attempted plot
dodge <- position_dodge(width=0.5)
p<- ggplot(data= df1, aes(x=var, y=id)) +
geom_line(aes(colour="Group 1"),position="dodge") +
geom_line(data= df2,aes(x=var, y=id,colour="Group 2"),position="dodge") +
scale_color_manual("",values=c("salmon","skyblue2"))
p
其中产生:
enter image description here
这里的“Group 2”行隐藏了所有“Group 1”行,这不是我想要的。相反,我希望“第 2 组”行低于“第 1 组”行。我环顾四周,发现了以前的帖子: ggplot2 offset scatterplot points但我似乎无法调整代码以在使用单独的数据帧时让两条 geom_lines 相互躲避。
我一直在将我的 y 变量转换为数字并稍微偏移它们以获得所需的输出,但我想知道是否有一种更快/更简单的方法来使用 ggplot 的闪避功能或其他东西来获得相同的结果。
我的解决代码很简单:
p<- ggplot(data= df1, aes(x=var, y=id_num))  +
geom_line(aes(colour="Group 1")) +
geom_line(data= df2,aes(x=var, y=id_num,colour="Group 2")) +
scale_color_manual("",values=c("salmon","skyblue2")) +
scale_y_continuous(lim=c(0,1))
p
给我我想要的输出:
期望的输出:
Desired output
当我尝试扩展它以适合我的实际数据时,数字方法可能有点麻烦。我必须将我的 y 值转换为因子,将它们更改为数字,然后将这些值合并到第二个数据集,因此更快的方法会更可取。在此先感谢您的帮助!

最佳答案

您实际上在这里有两个问题:

  • 如果使用两层 geom_line() 绘制两条线(因为您有两个数据框),那么每一行“不知道”另一行。因此,他们无法互相躲避。
  • position_dodge()用于水平方向的闪避。标准示例是条形图,您可以在其中将各种条形彼此相邻放置(而不是彼此重叠)。但是,您想在垂直方向上躲避。

  • 问题 1 通过将数据帧合并为一个来解决,如下所示:
    library(dplyr)
    df_all <- bind_rows(Group1 = df1, Group2 = df2, .id = "group")
    df_all
    ## Source: local data frame [4 x 4]
    ##
    ## group id var id_num
    ## (chr) (fctr) (dbl) (dbl)
    ## 1 Group1 A 1 1.0
    ## 2 Group1 A 10 1.0
    ## 3 Group2 A 1 0.9
    ## 4 Group2 A 15 0.9

    注意如何设置 .id = "Group"bind_rows()创建专栏 group标签取自与 df1 一起使用的名称和 df2 .

    然后,您可以使用单个 geom_line() 绘制两条线。 :
    library(ggplot2)
    ggplot(data = df_all, aes(x=var, y=id, colour = group)) +
    geom_line(position = position_dodge(width = 0.5)) +
    scale_color_manual("",values=c("salmon","skyblue2"))

    enter image description here

    我也用过 position_dodge()明确地向您展示问题 2。如果仔细观察,您可以看到左侧的红线稍微突出。这是两条线在垂直方向上相互躲避(不是很成功)的结果。

    您可以通过交换 x 和 y 坐标来解决问题 2。在这种情况下,水平躲避是正确的做法:
    ggplot(data = df_all, aes(y=var, x=id, colour = group))  +
    geom_line(position = position_dodge(width = 0.5)) +
    scale_color_manual("",values=c("salmon","skyblue2"))

    enter image description here

    最后一步是使用 coord_flip()获得所需的情节:
    ggplot(data = df_all, aes(y=var, x=id, colour = group))  +
    geom_line(position = position_dodge(width = 0.5)) +
    scale_color_manual("",values=c("salmon","skyblue2")) +
    coord_flip()

    enter image description here

    关于R - ggplot 躲避 geom_lines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227482/

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