Как восстановить гистограмму в R? - PullRequest
0 голосов
/ 05 февраля 2020
Ответ

PA C на этот пост показывает, как экспортировать данные гистограммы из R в CSV.

> x  <- rnorm(1000)
> h  <- hist(x)
> h
$breaks
[1] -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0  2.5  3.0  3.5  4.0

$counts
[1]   1   5  23  38 104 154 208 191 130  85  39  17   4   0   1

$density
[1] 0.002 0.010 0.046 0.076 0.208 0.308 0.416 0.382 0.260 0.170 0.078 0.034 0.008 0.000 0.002

$mids
[1] -3.25 -2.75 -2.25 -1.75 -1.25 -0.75 -0.25  0.25  0.75  1.25  1.75  2.25  2.75  3.25  3.75

$xname
[1] "x"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"
> out  <- data.frame(mid = h$mids, counts = h$counts)
> write.table(out, file = "export.csv", row.names = FALSE, sep = ",")

Предположим, я сохранил гистограмму breaks, counts, density, mids значений в CSV-файле с использованием вышеупомянутого подхода. Теперь, как загрузить файл CSV в RStudio и восстановить гистограмму из значений файла CSV. Пожалуйста, дайте мне знать. Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 05 февраля 2020

Что ж, если вы действительно хотите написать гистограмму в виде csv и иметь возможность полностью восстановить ее из этого csv, вы можете. Вероятно, я бы сам использовал один из других методов, но было бы полезно посмотреть, как это можно сделать:

Мы начнем с определения функции, которая сохраняет гистограмму в CSV, прежде всего сделав ее в кадре данных. Мы должны добавить все элементы данных гистограммы, чтобы они были одинаковой длины, но мы легко изменим это, когда перезагрузим csv:

# Save a histogram object to csv
hist2csv <- function(h, csv_path)
{
  df <-  data.frame(breaks = h$breaks,   counts = c(h$counts, 1),
                    density = c(h$density, 1), mids = c(h$mids, 1),
                    xname = rep(h$xname, length(h$breaks)), 
                    equidist = rep(T, length(h$breaks)))

  write.csv(df, csv_path)
}

Функция загрузки просто переворачивает этот процесс и гарантирует, что Результирующий список классифицируется как гистограмма:

# Load a histogram object from csv
csv2hist <- function(csv_path)
{
  df         <- read.csv(csv_path)
  h          <- as.list(df)
  h$counts   <- h$counts[-length(h$breaks)]
  h$density  <- h$density[-length(h$breaks)]
  h$mids     <- h$mids[-length(h$breaks)]
  h$xname    <- h$xname[1]
  h$equidist <- h$equidist[1]
  class(h)   <- "histogram"

  return(h)
}

Так что теперь вы можете сделать

x  <- rnorm(1000)
h  <- hist(x)

# Save csv
hist2csv(h, "hist.csv")

# Load csv as histogram
new_h <- csv2hist("hist.csv") 

# Plot as normal
plot(new_h)

enter image description here

3 голосов
/ 05 февраля 2020

Если вы хотите восстановить его исключительно из чисел, то, возможно:

h <- hist(mtcars$disp)

histogram

wid <- min(diff(h$mids))/2
plot(NA, type='n', xlim=range(h$mids) + wid*c(-1, 1), ylim = c(0, max(h$counts)), frame.plot = FALSE)
rect(h$mids - wid, 0, h$mids + wid, h$counts)

reconstituted histogram

(несмотря на ярлыки ...)

1 голос
/ 05 февраля 2020

Если это регенерировать сюжет, было бы лучше сохранить его как .RData

save(h, file = "file1.RData")

В новой R сессии

load("file1.RData")
ls()
#[1] "h"
plot(h)

enter image description here

0 голосов
/ 05 февраля 2020

Если вам нужно восстановить гистограмму, чтобы использовать ее для презентации, вы также можете просто распечатать ее как файл png.

png('histogram_plot.png', width=2000, height = 1000) 
#or whatever size works for the histogram
dev.off()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...