Как я могу создать диаграмму рассеяния плотности с логарифмическим масштабом в R?

#r #ggplot2 #scatter-plot

#r #ggplot2 #диаграмма рассеяния

Вопрос:

Я хотел бы создать диаграмму рассеяния плотности с масштабом log10 в R. Я попытался построить ее с помощью ggplot и stat_density2d в R. Я использовал этот код:

 ggplot(data=vod_agb_df, aes(vod, agb))   
       stat_density2d(aes(fill = ..density..), geom = "tile", contour = FALSE, n = 100)   
       scale_fill_distiller(palette = 'YlOrRd', direction = 1)  
       scale_x_continuous(breaks=seq(0, 1, 0.25), limits = c(0, 1))   
       scale_y_continuous(breaks=seq(0, 300, 50), limits = c(0, 300))   
       labs(x='L-VOD', y='AGB(Mg/ha)')  
       theme_bw()
  

Но результат выглядит странно. диаграмма рассеяния плотности с моим кодом

Это график, который я хочу построить
Исходная диаграмма рассеяния

Ответ №1:

Вы можете log10 преобразовать плотность; вот минимальный и воспроизводимый пример

 library(MASS)
library(tidyverse)

set.seed(2020)
mvrnorm(100, mu = c(0, 0), Sigma = matrix(c(1, 0.5, 0.5, 1), 2, 2)) %>%
    as_tibble() %>%
    ggplot(aes(V1, V2))   
    stat_density2d(
        aes(fill = log10(..density..)), geom = "tile", contour = FALSE, n = 100)   
    scale_fill_distiller(palette = 'YlOrRd', direction = 1)   
    theme_bw()
  

введите описание изображения здесь


Обновить

Мне непонятно, что вы подразумеваете под «»Я хотел бы создать диаграмму рассеяния плотности в области распределения точек, а не во всей области графика.»» Если вы спрашиваете, как увеличить высоту градиентной цветовой полосы, вы можете сделать следующее

 set.seed(2020)
mvrnorm(100, mu = c(0, 0), Sigma = matrix(c(1, 0.5, 0.5, 1), 2, 2)) %>%
    as_tibble() %>%
    ggplot(aes(V1, V2))   
    stat_density2d(
        aes(fill = log10(..density..)), geom = "tile", contour = FALSE, n = 100)   
    scale_fill_distiller(palette = 'YlOrRd', direction = 1)   
    theme_bw()   
    guides(fill = guide_colorbar(barheight = unit(3.5, "in"), title.position = "right"))    

  

введите описание изображения здесь

Комментарии:

1. спасибо за ваш ответ. Но кажется, что цветной график плотности является минимальным ограничивающим прямоугольником точек рассеяния. Я опубликовал исходную диаграмму рассеяния в вопросе.

2. @changkx Я не знаю, что вы подразумеваете под «минимальным ограничивающим прямоугольником». Градиентная цветовая шкала соответствует плотности, преобразованной в log10. Я думал, что это то, что вам нужно (график, который вы показываете, предполагает это)? Или вы хотите преобразовать значения log10-transform по осям x и / или y?

3. Да, преобразованная в log10 плотность — это то, что я хочу. Но в соответствии с исходной диаграммой рассеяния (я обновил ее в ответе). Я хотел бы создать диаграмму рассеяния плотности в области распределения точек, а не во всей области графика.

4. @changkx «Я бы хотел создать диаграмму рассеяния плотности в области распределения точек, а не во всей области графика». Извините, но я действительно не понимаю, что вы имеете в виду. Что такое «область распределения точек»? Возможно, вы спрашиваете, как увеличить высоту градиентной цветовой шкалы, чтобы она соответствовала высоте графика?

5. Спасибо за ваш подробный и информативный ответ. Извините за мое замешательство. Как показано на «Исходной диаграмме рассеяния» , существует приблизительная линейная зависимость. Итак, я хотел бы отобразить ее как диаграмму рассеяния плотности, точно так же, как «образец графика» в вопросе.

Ответ №2:

Какой бы график вы ни показывали в качестве ожидаемого результата, для этого вы можете использовать следующий код

 library(tidyverse)

# Bin size control   color palette
ggplot(iris, aes(x=Sepal.Length, y=Petal.Length) )  
  geom_bin2d(bins = 20)  
  scale_fill_distiller(palette = 'YlOrRd', direction = 1)  
  theme_bw()  
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
  

введите описание изображения здесь

Комментарии:

1. Я не уверен, что это отвечает на вопрос OPs: (1) OP хочет показать график плотности 2d, вы показываете количество . (2) OP хотел бы log10-преобразовать плотность; вы не преобразуете данные в журнал.

2. Да, Мауриц Эверс. Вы правы. Если бы подсчеты можно было заменить на log10-преобразованную плотность, это то, что я хочу, точно так же, как образец графика.