Создание и сохранение одного и того же графика для нескольких файлов данных - сохранение только изображения для 1 файла, которое выглядит как белый прямоугольник без данных - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть подготовленная программа моделирования, которая создает 26 отдельных файлов, которые мне нужно одинаково очерчивать на графике в R - я планирую многократно запускать эту программу и, следовательно, пытаюсь создать цикл, который создает и сохраняет графики для всех 26 файлов для каждого прогона.

Я пытаюсь сохранить файлы с их исходными именами (пока что имело место имя метки), поэтому я создал объект «имена» и сохранил каждый из них в файл png или jpeg. На данный момент цикл сохраняет только 1 файл (несмотря на чтение в 4 наборах данных со списком list.files), и он выглядит как белый квадрат с правильными размерами, а не как график, созданный makeplot (протестирован на отдельных файлах). ).

Образец моих данных:

Z    X     T
0    0     0
0    0.005 0
0    0.01  0
0    0.015 0

(и так далее для 84k строк)

Мой код:

filenames <- list.files(path=".",
                    pattern="csv", 
                    full.names=TRUE)

names <- as.vector(filenames)

# Creating a directory to save contour plots
dir.create("Contour plots")

#Creates a contour plot in ggplot of the variable in xz space
makeplot <- function(filename) {
  data <- as.data.frame(read.csv(file = filename), header = FALSE)
  ggplot(data=data, mapping = aes(x = data[,2], 
                              y=data[,1], 
                              z = data[,3])) +

    geom_raster(data=data, aes(fill=data[,3]), show.legend=TRUE, interpolate         
    = FALSE) +
    scale_fill_gradient(limits=range(data[,3]), high = 'red', low =     
    'white')+
    geom_contour(bins = 30, colour = "black") +
    xlab(label = "Distance from ridge axis") +
    ylab(label = "Depth") +
    theme_classic()+
    coord_cartesian(
    ylim = c(0,1), xlim = c(0,2))+
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) +
    guides(fill=guide_legend(title="Yb concentration")) +
    theme(legend.position="bottom")
  }

for (f in filenames) {
  png(filename="Rplot%03d.png", height = 600, width = 1200)
  makeplot(f)
  dev.off()
}

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 15 ноября 2018

Я хотел бы предложить альтернативную стратегию

  1. путь к файлу ввода

    filepath <- dir(path=".", pattern="csv", full.names=TRUE)

  2. редактировать ваши имена файлов с помощьюрегулярное выражение.например, заменить расширение «.csv» и / или получить фантазию строковыми литералами и интерполяцией (см. library(glue)).В большинстве случаев в реальной жизни я не хочу продвигать весь путь, генерируемый опцией full.names выше.

OUTPATH <- "whatever/Rplot"

filenames <- paste0(OUTPATH, gsub("\\.csv$", ".png", filepath))

отредактируйте свою makeplot() подпись следующим образом:

makeplot <- function(filepath, filenames) {

И перейдите к более идиоматическому Map(), чтобы перебрать два списка. Примечание: не стесняйтесь проверять map2 из purrr в качестве альтернативы Map()

Map(function(x, y) makeplot(filepath = x, filenames = y), 
     x = filepath, 
     y = filenames)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...