如何在ggplot2中制作渐变色X-Y图?

时间:2019-01-09 19:05:05

标签: r ggplot2

我正在尝试绘制与此类似的情节。

Sample colour gradient plot

这类似于热图,但是明显不同,因为颜色不对应计数。我使用了geom_point()制作出了这条线,每条线之间的差异很小。

library(tidyverse)

data = crossing(
    x = seq(-1, 1, by = 0.01), 
    a = seq(1, 5, by = 0.01)
  ) %>%
  mutate(y = a*x^2) 

ggplot(data, aes(x = x, y = y, colour = a)) +
    geom_point() +
    labs(title = "Plot of y = ax^2")

显然,这不理想,因为它要花费大量时间并生成超过80k行的数据集。我敢肯定有更好的方法可以做到这一点。有什么想法吗?谢谢。

编辑: 基于@Axeman的评论,我使用了geom_raster。天真的版本不起作用,即

 ggplot(data, aes(x = x, y = y, fill = a)) +
  geom_raster()

结果是错误

  

矩阵中的错误(NA_character_,nrow = nrow,ncol = ncol):无效   'nrow'值(太大或不适用)另外:警告消息:在f(...)   :强制将NA引入整数范围

似乎与xy的并非每种组合都有关系。如果我在代码中切换了ay,它确实可以工作。使用这些信息,此代码可以生成我在此特定情况下所需的内容。

data = crossing(
  x = seq(-1, 1, by = 0.01),
  y = seq(0, 5, by = 0.01)
) %>%
  mutate(a = y/(x^2)) %>%
  filter(a <= 5 & a >= 1)

ggplot(data, aes(x = x, y = y, fill = a)) +
  geom_raster()

Second try

它的工作速度更快,但是需要我解决要为a绘制的方程。我认为这与复杂的方程式或经验数据都无法很好地匹配。一定有更好的方法。

1 个答案:

答案 0 :(得分:0)

首先,需要使用geom_raster(感谢@Axeman)。其次,尽管我使用的是最新的ggplot2软件包(3.1.0),但@Chris共享的链接(https://github.com/tidyverse/ggplot2/issues/2516)似乎证明了我的问题。

所以最后,此代码有效:

library(tidyverse)

data_bad = crossing(
    x = seq(-1, 1, by = 0.01), 
    a = seq(1, 5, by = 0.01)
  ) %>%
  mutate(y = a*x^2)

ggplot(data_bad, aes(x = round(x,2), y = round(y,2), fill = a)) +
  geom_raster()

唯一的问题是,您需要将舍入数字与数据的精度相匹配,否则绘图的中间会有很多空白。

但是此解决方案足够有效。感谢您的帮助。