【问题标题】:Why is the variable considered continous in legend?为什么变量在传说中被认为是连续的?
【发布时间】:2021-03-17 11:22:11
【问题描述】:

我用下面的代码用ggplot生成了一个图:

  1. 我希望图例显示第 1-8 卷,只有第 12.5 卷和第 25 卷,为什么不显示?
  2. 即使有重叠,是否可以显示图中的所有点?因为现在由于重叠,该图只显示了 8 个点中的 4 个。

【问题讨论】:

  • 尝试将它们转换为因子而不是数字类型,例如颜色 = as.factor(音量)。此外,你不应该在 aes 调用中需要 df$。
  • 谢谢,它解决了我的问题!是否可以更改图例名称?因为现在我知道图例名称是 as.factor(Volume) 并且是否可以断开时间点 584 和 1184 之间的线路?

标签: r ggplot2 legend


【解决方案1】:

操作。你已经得到了部分答案。根据您的附加评论和一些解释,这是一个解决方案。

作为参考,您希望:

  • 将连续变量更改为离散/不连续变量,并将其反映在图例中。
  • 显示在图例中标记的运行 1-8
  • 根据数据集中的某些条件断开线路。

首先,我在这里以可重现的方式再次表示您的数据(并去掉多余的字符,以便您可以直接跟随所有代码):

library(ggplot2)
mydata <- data.frame(
  `Run`=c(1:8),
  "Time"=c(834, 834, 584, 584, 1184, 1184, 938, 938),
  `Area`=c(55.308, 55.308, 79.847, 79.847, 81.236, 81.236, 96.842, 96.842),
  `Volume`=c(12.5, 12.5, 12.5, 12.5, 25.0, 25.0, 25.0, 25.0)
)

改为离散变量

如果您检查每列的变量类型(类型 str(mydata)),您会看到 mydata$Runint,其余列是 num。每一列都被理解为一个数字,它被视为一个连续变量。当需要绘制数据时,ggplot2 理解这意味着,由于这些值之间可以存在值是合理的(它们是连续的),任何图例形式的表示都应该能够表明这一点。因此,您会得到一个连续的色标,而不是一个离散的色标。

要强制ggplot2 为您提供离散比例,您必须使您的数据离散并指出它是一个因素。您可以在绘图前将变量设置为因子(例如:mydata$Run &lt;- as.factor(mydata$Run),或使用内联代码,指的是 aes(size = factor(Run),... 而不仅仅是 aes(size = Run,...

ggplot 调用中使用对factor(Run) 内联的引用具有将变量名称更改为图例中的“因子(运行)”的效果,因此您还必须将其添加到@987654340 @对象调用。最后,情节代码如下所示:

ggplot(data = mydata, aes(x=Area, y=Time)) +
  geom_point(aes(color =as.factor(Volume), size = Run)) +
  geom_line() +
  labs(
    x = "Area", y = "Time",
    
    # This has to be changed now
    color='Volume'
  ) +
  theme_bw()

请注意,在上面的代码中,我也不是指mydata$Run,而只是Run。在使用ggplot2 时,最好只引用列的名称。无论哪种方式都有效,但在实践中要好得多。

断开线路

您的线在整个数据中连接的原因是因为除了x=y= 的美学之外,没有为geom_line() 对象提供任何信息。如果你想有单独的线条,就像有不同的颜色或形状的点一样,你需要提供一种美学作为基础。由于根据数据集中的变量 Volume ,这两行是不同的,因此您希望使用它......但保持两者的颜色相同。为此,我们使用group= 美学。它告诉ggplot2,我们想为按该美学分组的每条数据画一条线。

ggplot(data = mydata, aes(x=Area, y=Time)) +
  geom_point(aes(color =as.factor(Volume), size = Run)) +
  geom_line(aes(group=as.factor(Volume))) +
  labs(
    x = "Area", y = "Time", color='Volume'
  ) +
  theme_bw()

显示在图例中标记的运行 1-8

在这里,我正在阅读您在图例中的“显示第 1-8 次运行”方面真正想要做的事情。这可能意味着两件事之一,我会假设你想要两者并告诉你如何做到这两件事。

  1. 在图例中列出并显示尺寸 1-8。

要设置您在比例(图例)中看到的尺寸值,您可以参考各种scale_ 函数以了解所有类型的美学。在这种情况下,请记住,由于 mydata$Runint,因此它被视为连续刻度。 ggplot2 不知道如何绘制连续的大小比例,因此图例本身显示了离散大小的点。这意味着我们不需要将 Run 更改为一个因子,但我们需要明确指出我们希望在图例中显示从 1 到 8 序列中的所有中断。您可以使用 scale_size_continuous(breaks=...) 执行此操作.

ggplot(data = mydata, aes(x=Area, y=Time)) +
  geom_point(aes(color =as.factor(Volume), size = Run)) +
  geom_line(aes(group=as.factor(Volume))) +
  labs(
    x = "Area", y = "Time", color='Volume'
  ) +
  scale_size_continuous(breaks=c(1:8)) +
  theme_bw()

  1. 将您的所有跑步都显示为分数

关于显示所有运行的注释可能还意味着您希望将每个运行都表示为绘图中的一个离散点。为此……好吧,他们已经是了! ggplot2 正在将数据中的每个点绘制到图表中。由于某些点共享相同的 x=y= 值,因此您正在过度绘制 - 这些点被绘制在彼此之上。

如果您想直观地查看此处表示的每个点,一个选项可能是使用geom_jitter() 而不是geom_point()。这里不是很好,因为它看起来像您的数据具有不同的 x 和 y 值,但如果这是您想要做的,它是一个选项。请注意,在下面的代码中,为了更清晰,我还将点的形状更改为空心圆,其中 color= 是每个点周围的线(这里是黑色),而使用 fill= 美学为音量。不过你应该明白了。

set.seed(1234)  # using the same randomization seed ensures you have the same jitter
ggplot(data = mydata, aes(x=Area, y=Time)) +
  geom_jitter(aes(fill =as.factor(Volume), size = Run), shape=21, color='black') +
  geom_line(aes(group=as.factor(Volume))) +
  labs(
    x = "Area", y = "Time", fill='Volume'
  ) +
  scale_size_continuous(breaks=c(1:8)) +
  theme_bw()

【讨论】:

  • 哇,非常感谢您的时间和指导。它对我帮助很大:) 是否可以制作空心环而不是使用抖动,然后它们的点可以重叠,我们仍然可以将它们彼此区分开来?
  • 我通过 eipi10 找到了这个答案。我尝试应用不同的标记大小,但无法将解决方案应用于我的问题。你建议我怎么做?stackoverflow.com/questions/47955292/…
猜你喜欢
  • 2011-10-24
  • 2020-01-06
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多