我试图通过对细菌种群的径向强度测量,绘制一个圆形的强度密度图。
我已经研究了各种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图。只是觉得我已经尝试了所有的东西,用其他的例子,我会有可能重叠和‘淹没’的表面,并在不同的距离重新出现。因此,任何关于如何解决这一问题的建议都将是很棒的。
任何帮助都将不胜感激。
发布于 2022-07-31 19:11:08
这听起来好像你在试图用等高线或2D密度图来表示x,y,z数据。为了做到这一点,您的数据必须组织成一个常规的网格。
我的理解是,数据中的x值代表细菌菌落中心的径向距离,z值代表那个点的密度。这给了我们足够的信息来创建一个三维表面,前提是我们可以假设这个群体是完全径向对称的。
我们从加载数据开始,并通过增加x值来排列它:
df <- read.csv('my_data.csv')
df <- df[order(df$x),]现在,我们创建了一个距离中心的径向距离序列,它包含我们的数据集,并将用作网格的x和y坐标。我们需要足够的点来使网格平滑,所以我们将在网格的每一侧使用300个点:
radii <- seq(min(df$x), max(df$x), length = 300)现在,我们可以使用expand.grid创建这些点的所有x,y组合的网格,然后找到从每个点到中心的欧几里德距离:
plot_df <- expand.grid(x = radii, y = radii)
plot_df$radius <- sqrt(plot_df$x^2 + plot_df$y^2)要获得每个网格点的z值,我们可以使用findInterval,它将识别原始数据帧中最接近每个网格点半径的行。该行的z值将是网格点的z值:
plot_df$z <- df$z[findInterval(plot_df$radius, df$x)]现在,我们可以使用geom_raster绘制结果。
library(ggplot2)
p <- ggplot(plot_df, aes(x, y, fill = z)) +
geom_raster() +
coord_equal() +
scale_fill_viridis_c()
p

如果要添加标记的等高线,可以:
library(geomtextpath)
p + geom_textcontour(aes(z = z, label = ..level..), breaks = 5:9)

三个数据集的更新()
这表明哪一个群体的密度最高,在哪一点:
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()

https://stackoverflow.com/questions/73185155
复制相似问题