Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
手动将图例添加到R/ggplot2绘图,而不干扰绘图_R_Ggplot2_Legend - Fatal编程技术网

手动将图例添加到R/ggplot2绘图,而不干扰绘图

手动将图例添加到R/ggplot2绘图,而不干扰绘图,r,ggplot2,legend,R,Ggplot2,Legend,问:有没有可能在情节中添加一个与情节本身无关的图例,而且最关键的是,它不会干扰情节中的颜色 解释 我有关于传奇的所有信息。特别是,我有颜色的十六进制代码和标签。我不在乎什么形状显示线,点,以最容易的 我希望这能起到作用这是一个非常简单的最小工作示例: the_colors <- c("#e6194b", "#3cb44b", "#ffe119", "#0082c8", "#f58231", "#911eb4", "#46f0f0", "#f032e6",

问:有没有可能在情节中添加一个与情节本身无关的图例,而且最关键的是,它不会干扰情节中的颜色

解释

我有关于传奇的所有信息。特别是,我有颜色的十六进制代码和标签。我不在乎什么形状显示线,点,以最容易的

我希望这能起到作用这是一个非常简单的最小工作示例:

the_colors <- c("#e6194b", "#3cb44b", "#ffe119", "#0082c8", "#f58231", "#911eb4", "#46f0f0", "#f032e6", 
                "#d2f53c", "#fabebe", "#008080", "#e6beff", "#aa6e28", "#fffac8", "#800000", "#aaffc3", 
                "#808000", "#ffd8b1", "#000080", "#808080", "#ffffff", "#000000")
the_labels <- c("01", "02", "03", "04", "05", "06", "07", "08", "09", "10")

the_df <- data.frame("col1"=c(1, 2, 2, 1), "col2"=c(2, 2, 1, 1), "col3"=c(1, 2, 3, 4))

the_plot <- ggplot() + geom_point(data=the_df, aes(x=col1, y=col2), color=the_colors[[4]])

the_plot <- the_plot +
  scale_color_manual("Line.Color", values=the_colors[1:length(the_labels)],
                      labels=the_labels)
但是,当然,它不再将传递的值作为颜色参数,而是将其解释为某种标签,并将这些数据点的颜色更改为_colors列表中的第一种颜色。同时,它只会在传说中包括这一个,而地狱里似乎没有办法说服它也包括其他人

在其他语言中,这是难以置信的简单。在R/ggplot2中,这似乎难以置信地困难

我想这样做的原因是:我想要一个不干扰我的情节色彩的传奇。这有时很不方便。图例必须与绘图中的颜色相混淆也没有更深层次的原因,只是在R/ggplot2中它是如何实现的

方法:我希望有一种方法可以轻松做到这一点,仍然将其视为一个传奇。如果做不到这一点,可以添加一个带有一些彩色点和一些文本的框,从而从头构建一个图例

其他问题:也有很多其他问题问同样的问题。相反,答案确实提出了解决OP具体问题的变通方法,通常是通过应用melt或其他方法,而不提供如何手动添加图例而不影响情节的问题的解决方案。例如,和。这不是我感兴趣的。我想知道我是否可以在任意的情节中添加任意的图例,如果可以,如何添加

软件:R 3.6.3,ggplot2 3.2.1

2020年3月30日编辑:

解决方案:如@Tjebo在下面的回答中所述,可以使用scale\u color\u identity创建一个与绘图合理独立的图例,并定义绘图中未显示的其他数据系列。通过@Tjebo回答中的选项1,我可以解决眼前的问题:

the_colors <- sort(c("#e6194b", "#3cb44b", "#ffe119", "#0082c8", "#f58231", "#911eb4", "#46f0f0", "#f032e6", 
            "#d2f53c", "#fabebe", "#008080", "#e6beff", "#aa6e28", "#fffac8", "#800000", "#aaffc3", 
            "#808000", "#ffd8b1", "#000080", "#808080"))

color_df <- data.frame(the_colors=the_colors[1:length(the_labels)], the_labels=the_labels)

the_df <- data.frame("col1"=c(1, 2, 2, 1), "col2"=c(2, 2, 1, 1), "col3"=c(1, 2, 3, 4))

the_plot <- ggplot() + 
    geom_point(data = color_df, aes(x = the_df$col1[[1]], y = the_df$col2[[1]], color = the_colors)) +
    scale_color_identity(guide = 'legend', labels = color_df$the_labels) 

the_plot <- the_plot +
  geom_point(data=the_df, aes(x=col1, y=col2), color=the_colors[[4]]) 

print(the_plot)
注:如果颜色定义为数据框中的第三列,也可以立即绘制数据系列。我只是想指出,解决方案是灵活的,以后可以修改绘图,而不会干扰图例或绘图中已排列的数据点的颜色

编辑2020年3月30日,附加说明:使用此解决方案,图例将按十六进制代码对颜色进行排序。我无法理解它为什么会这样做,但它确实做到了。因此,为了使图例中的颜色与预期的颜色相匹配,十六进制代码的向量应该像上面代码中所做的那样预先排序


在R和ggplot2的正常使用中,这样的意外行为不会引起关注,因为您让ggplot2为您做图例,并严格限制自己使用的设计。这个解决方案基本上是一个关于如何在ggplot2中使用图例的破解,不幸的是,它限制性很大。因此,这种黑客行为很可能会在未来版本的ggplot或R中被破解。

也许这就是你想要的。。Plot 1绝对不是一种聪明的、ggplot-y的绘图方式。本质上,您并没有可视化数据的维度。下面是另一个选项图2

下图-创建新的数据框并使用比例\颜色\标识进行绘图。使用第二个绘图的数据点,该数据点位于第二个绘图点,并对第一个绘图点进行过多绘图,因此该点消失

图书馆管理员
ggplot或R中的_颜色?如果是基本图形,那么它非常简单。@Edward谢谢;不幸的是,我确实需要ggplot2的其他功能,尽管我没有在示例中包括这些功能。感谢您提供了这个非常全面的答案。你是对的,在我的例子中,颜色与正在绘制的数据帧有关,所以你的第二个更ggplot-y的解决方案也很好。然而,我认为更一般的问题是要问一个图例,它与数据无关,不会被数据改变,反之亦然。您的第一个解决方案是以这种方式模块化的;我喜欢。关于你的第一个解决方案的最后一句话。在本例中,R/ggplot2将按十六进制代码字符串对颜色进行排序。这反过来意味着,如果事先对向量进行排序,则硬编码为_颜色向量中位置的图中的颜色通常只会产生预期的颜色。位置4的蓝色0082c8在这里是一个例外。这是正确的。我不喜欢这个解决方案的另一个原因!控制值/标签配对更具挑战性
the_colors <- sort(c("#e6194b", "#3cb44b", "#ffe119", "#0082c8", "#f58231", "#911eb4", "#46f0f0", "#f032e6", 
            "#d2f53c", "#fabebe", "#008080", "#e6beff", "#aa6e28", "#fffac8", "#800000", "#aaffc3", 
            "#808000", "#ffd8b1", "#000080", "#808080"))

color_df <- data.frame(the_colors=the_colors[1:length(the_labels)], the_labels=the_labels)

the_df <- data.frame("col1"=c(1, 2, 2, 1), "col2"=c(2, 2, 1, 1), "col3"=c(1, 2, 3, 4))

the_plot <- ggplot() + 
    geom_point(data = color_df, aes(x = the_df$col1[[1]], y = the_df$col2[[1]], color = the_colors)) +
    scale_color_identity(guide = 'legend', labels = color_df$the_labels) 

the_plot <- the_plot +
  geom_point(data=the_df, aes(x=col1, y=col2), color=the_colors[[4]]) 

print(the_plot)
the_plot <- ggplot() + 
  geom_point(data = color_df, aes(x = the_df$col1[[1]], y = the_df$col2[[1]], color = the_colors)) +
  scale_color_identity(guide = 'legend', labels = color_df$the_labels)
the_plot <- the_plot + 
  geom_point(data=the_df, aes(x=col1, y=col2), color=the_colors[[4]])
the_plot <- the_plot +
  geom_point(data=the_df, aes(x=col1, y=col3), color=the_colors[[6]])