Создание граненых рассеивателей xy, используя векторы имен столбцов в R - PullRequest
1 голос
/ 20 октября 2019

У меня есть два символьных вектора одинаковой длины;где позиция один в vector.x соответствует позиции один в vector.y и так далее. Элементы относятся к именам столбцов во фрейме данных (в широком формате). Я хотел бы как-то перебрать эти векторы, чтобы получить графики рассеяния xy для каждой пары в векторе, предпочтительно на граненом графике. Вот (надеюсь) воспроизводимый пример. Для ясности, в этом примере я бы получил 10 диаграмм рассеяния.

vector.x <- c("Aplanochytrium", "Aplanochytrium", "Aplanochytrium", "Aplanochytrium", "Aplanochytrium", "Bathycoccus", "Brockmanniella", "Brockmanniella",  "Caecitellus_paraparvulus", "Caecitellus_paraparvulus")

vector.y <- c("Aliiroseovarius", "Neptuniibacter", "Pseudofulvibacter", "Thalassobius", "unclassified_Porticoccus", "Tenacibaculum", "Pseudomonas", "unclassified_GpIIa", "Marinobacter", "Thalassobius")
structure(list(Aliiroseovarius = c(0, 0, 0, 0.00487132352941176, 
0.0108639420589757), Marinobacter = c(0, 0.00219023779724656, 
0, 0.00137867647058824, 0.00310398344542162), Neptuniibacter = c(0.00945829750644884, 
0.00959532749269921, 0.0171310629514964, 0.2796875, 0.345835488877393
), Pseudofulvibacter = c(0, 0, 0, 0.00284926470588235, 0.00362131401965856
), Pseudomonas = c(0.00466773123694878, 0.00782227784730914, 
0.0282765737874097, 0.00707720588235294, 0.00400931195033627), 
    Tenacibaculum = c(0, 0, 0, 0.00505514705882353, 0.00362131401965856
    ), Thalassobius = c(0, 0.00166875260742595, 0, 0.0633272058823529, 
    0.147697878944646), unclassified_GpIIa = c(0, 0.000730079265748853, 
    0, 0.003125, 0.00103466114847387), unclassified_Porticoccus = c(0, 
    0, 0, 0.00119485294117647, 0.00569063631660631), Aplanochytrium = c(0, 
    0, 0, 0.000700770847932726, 0.0315839846865529), Bathycoccus = c(0.000388802488335925, 
    0, 0, 0.0227750525578136, 0.00526399744775881), Brockmanniella = c(0, 
    0.00383141762452107, 0, 0.000875963559915907, 0), Caecitellus_paraparvulus = c(0, 
    0, 0, 0.000875963559915907, 0.00797575370872547)), row.names = c("B11", 
"B13", "B22", "DI5", "FF6"), class = "data.frame")

Ответы [ 3 ]

1 голос
/ 20 октября 2019

Это немного долго и запутанно, но работает.

library(tidyverse)
library(gridExtra)

df_list <- apply(data.frame(vector.x, vector.y), 1, function(x){
  DF <- df1[which(names(df1) %in% x)]
  i <- which(names(DF) %in% vector.x)
  if(i == 2) DF[2:1] else DF
})


gg_list <- lapply(df_list, function(DF){
  ggplot(DF, aes(x = get(names(DF)[1]), y = get(names(DF)[2]))) +
    geom_point() +
    xlab(label = names(DF)[1]) +
    ylab(label = names(DF)[2])
})


g <- do.call(grid.arrange, gg_list)
g

enter image description here

1 голос
/ 20 октября 2019

Как показывает Руи Баррадас, можно получить очень хороший сюжет из ggplot и gridExta . Если вы хотите придерживаться базы R, вот как вы это сделаете (при условии, что ваш набор данных называется df1):

# set plot sizes
par(mfcol = c(floor(sqrt(length(vector.x))), ceiling(sqrt(length(vector.x)))))

# loop through plots
for (i in 1:length(vector.x)) {
  plot(df1[[vector.x[i]]], df1[[vector.y[i]]], xlab = vector.x[i], ylab = vector.y[i])
}

# reset plot size
par(mfcol = c(1,1))

enter image description here

0 голосов
/ 20 октября 2019

Не слишком элегантно, но должно помочь вам:

vector.x <- c("Aplanochytrium", "Aplanochytrium", "Aplanochytrium", "Aplanochytrium", "Aplanochytrium", "Bathycoccus", "Brockmanniella", "Brockmanniella",  "Caecitellus_paraparvulus", "Caecitellus_paraparvulus")
vector.y <- c("Aliiroseovarius", "Neptuniibacter", "Pseudofulvibacter", "Thalassobius", "unclassified_Porticoccus", "Tenacibaculum", "Pseudomonas", "unclassified_GpIIa", "Marinobacter", "Thalassobius")

df1 = structure(
  list(Aliiroseovarius = c(0, 0, 0, 0.00487132352941176, 0.0108639420589757),
       Marinobacter = c(0, 0.00219023779724656, 0, 0.00137867647058824, 0.00310398344542162),
       Neptuniibacter = c(0.00945829750644884, 0.00959532749269921, 0.0171310629514964, 0.2796875, 0.345835488877393),
       Pseudofulvibacter = c(0, 0, 0, 0.00284926470588235, 0.00362131401965856),
       Pseudomonas = c(0.00466773123694878, 0.00782227784730914, 0.0282765737874097, 0.00707720588235294, 0.00400931195033627),
       Tenacibaculum = c(0, 0, 0, 0.00505514705882353, 0.00362131401965856),
       Thalassobius = c(0, 0.00166875260742595, 0, 0.0633272058823529, 0.147697878944646),
       unclassified_GpIIa = c(0, 0.000730079265748853, 0, 0.003125, 0.00103466114847387),
       unclassified_Porticoccus = c(0, 0, 0, 0.00119485294117647, 0.00569063631660631),
       Aplanochytrium = c(0, 0, 0, 0.000700770847932726, 0.0315839846865529),
       Bathycoccus = c(0.000388802488335925, 0, 0, 0.0227750525578136, 0.00526399744775881),
       Brockmanniella = c(0, 0.00383141762452107, 0, 0.000875963559915907, 0),
       Caecitellus_paraparvulus = c(0, 0, 0, 0.000875963559915907, 0.00797575370872547)),
  row.names = c("B11", "B13", "B22", "DI5", "FF6"),
  class = "data.frame"
)

df2 = NULL
for(i in 1:10) {
  df.tmp = data.frame(
    plot = paste0(vector.x[i], ":", vector.y[i]),
    x = df1[[vector.x[i]]],
    y = df1[[vector.y[i]]]
  )
  if(is.null(df2)) df2=df.tmp else df2 = rbind(df2, df.tmp)
}

ggplot(data=df2, aes(x, y)) +
  geom_point() + 
  facet_grid(cols = vars(plot))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...