我正在尝试绘制与此类似的情节。
这类似于热图,但是明显不同,因为颜色不对应计数。我使用了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引入整数范围
似乎与x
和y
的并非每种组合都有关系。如果我在代码中切换了a
和y
,它确实可以工作。使用这些信息,此代码可以生成我在此特定情况下所需的内容。
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()
它的工作速度更快,但是需要我解决要为a
绘制的方程。我认为这与复杂的方程式或经验数据都无法很好地匹配。一定有更好的方法。
答案 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()
唯一的问题是,您需要将舍入数字与数据的精度相匹配,否则绘图的中间会有很多空白。
但是此解决方案足够有效。感谢您的帮助。