首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法从x,y,z值绘制二维圆形密度图,这看起来像stat_density2d图?

有没有办法从x,y,z值绘制二维圆形密度图,这看起来像stat_density2d图?
EN

Stack Overflow用户
提问于 2022-07-31 16:45:22
回答 1查看 180关注 0票数 1

我试图通过对细菌种群的径向强度测量,绘制一个圆形的强度密度图。

我已经研究了各种3D,2D选项,以最好地表示数据。

实际上,我想要创建这样的东西:

R码:

df <- tibble(x_variable = rnorm(5000),y_variable = rnorm(5000))

ggplot(df,aes(x = x_variable,y= y_variable)) +stat_density2d(填充=..density.,等高线= F,geom = 'tile')

然而,我想要创造的,来自这是一个粗略的摘录。,其中x和y是离中心点的径向距离,密度/轮廓/阴影代表强度z。

我不介意它是一个等高线图,或者是上面看到的3D图。只是觉得我已经尝试了所有的东西,用其他的例子,我会有可能重叠和‘淹没’的表面,并在不同的距离重新出现。因此,任何关于如何解决这一问题的建议都将是很棒的。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2022-07-31 19:11:08

这听起来好像你在试图用等高线或2D密度图来表示x,y,z数据。为了做到这一点,您的数据必须组织成一个常规的网格。

我的理解是,数据中的x值代表细菌菌落中心的径向距离,z值代表那个点的密度。这给了我们足够的信息来创建一个三维表面,前提是我们可以假设这个群体是完全径向对称的。

我们从加载数据开始,并通过增加x值来排列它:

代码语言:javascript
运行
复制
df <- read.csv('my_data.csv')
df <- df[order(df$x),]

现在,我们创建了一个距离中心的径向距离序列,它包含我们的数据集,并将用作网格的x和y坐标。我们需要足够的点来使网格平滑,所以我们将在网格的每一侧使用300个点:

代码语言:javascript
运行
复制
radii <- seq(min(df$x), max(df$x), length = 300)

现在,我们可以使用expand.grid创建这些点的所有x,y组合的网格,然后找到从每个点到中心的欧几里德距离:

代码语言:javascript
运行
复制
plot_df        <- expand.grid(x = radii, y = radii)
plot_df$radius <- sqrt(plot_df$x^2 + plot_df$y^2)

要获得每个网格点的z值,我们可以使用findInterval,它将识别原始数据帧中最接近每个网格点半径的行。该行的z值将是网格点的z值:

代码语言:javascript
运行
复制
plot_df$z <- df$z[findInterval(plot_df$radius, df$x)]

现在,我们可以使用geom_raster绘制结果。

代码语言:javascript
运行
复制
library(ggplot2)

p <- ggplot(plot_df, aes(x, y, fill = z)) + 
  geom_raster() +
  coord_equal() +
  scale_fill_viridis_c()

p

如果要添加标记的等高线,可以:

代码语言:javascript
运行
复制
library(geomtextpath)

p + geom_textcontour(aes(z = z, label = ..level..), breaks = 5:9)

三个数据集的更新()

这表明哪一个群体的密度最高,在哪一点:

代码语言:javascript
运行
复制
plot_list <- lapply(paste0("my_data_", letters[1:3], ".csv"), 
  function(x) {
    df <- read.csv(x)
    df <- df[order(df$x),]
    radii <- seq(-2, 2, length = 300)
    plot_df <- expand.grid(x = radii, y = radii)
    plot_df$radius <- sqrt(plot_df$x^2 + plot_df$y^2)
    plot_df$z <- df$z[findInterval(plot_df$radius, df$x)]
    plot_df
  })

plot_list[[1]]$fill <- c("Col1", "Col2", "Col3")[apply(cbind(plot_list[[1]]$z, 
                          plot_list[[2]]$z, plot_list[[3]]$z), 1, which.max)]

ggplot(plot_list[[1]], aes(x, y, fill = fill)) +
  geom_raster() +
  coord_equal()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73185155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档