Это решение использует rgl
и производит этот сюжет:
Он использует эту функцию, которая принимает 3 аргумента:
df
: a data.frame
как ваш 'М' выше
x
: a numeric vector (or a 1-col
данные. frame ') для оси x
cols
: (optionnal) вектор цветов для повторения. Если отсутствует, черная линия рисуется
Вот функция:
nik_plot <- function(df, x, cols){
require(rgl)
# if a data.frame is
if (is.data.frame(x) && ncol(x)==1)
x <- as.numeric(x[, 1])
# prepare a vector of colors
if (missing(cols))
cols <- rep_len("#000000", nrow(df))
else
cols <- rep_len(cols, nrow(df))
# initialize an empty 3D plot
plot3d(NA, xlim=range(x), ylim=c(1, ncol(df)-1), zlim=range(df), xlab="Mass/Charge (M/Z)", ylab="Time", zlab="Ion Spectra", box=FALSE)
# draw lines, silently
silence_please <- sapply(1:ncol(df), function(i) lines3d(x=x, y=i, z=df[, i], col=cols[i]))
}
Обратите внимание, что вы можете удалить require(rgl)
из функции и library(rgl)
где-то в сценарии, например, в самом начале.
Если у вас нет rgl
, то install.packages("rgl")
.
Черные линии, по умолчанию, могут создавать эффект moiré, но повторяющаяся цветовая палитра хуже. Это может быть зависимым от мозга. Единственный цвет также позволит избежать искусственного измерения (и сильного).
В качестве примера ниже:
# black lines
nik_plot(M, x)
# as in the image above
nik_plot(M, x, "grey40")
# an unreadable rainbow
nik_plot(M, x, rainbow(12))
3D окне можно перемещаться с помощью мыши.
Вам нужно что-то еще?
EDIT
Вы можете построить свой второй участок с функцией ниже. Диапазон ваших данных настолько велик, и я думаю, что вся идея сдвига вверх вверх по каждой линии предотвращает наличие оси Y с надежным масштабом. Здесь я нормализовал все сигналы (0 < = сигнал < = 1).Также можно использовать параметр gap
. Мы могли бы отключить два поведения, но я думаю, что это хорошо. Попробуйте различные значения gap
и посмотрите примеры ниже.
df
: а data.frame
так же, как ваш 'M' выше
x
: а numeric vector (or a 1-col
data.frame`) для оси х
cols
: (optionnal) вектор цветов повторить. Если отсутствует, черная линия рисуется
gap
: коэффициент разрыва между отдельными линиями
more_gap_each
: каждые п линии, больший разрыв производится ...
more_gap_relative
: ... и будет gap
х more_gap_relative
широкого
Вот функция:
nik_plot2D <- function(df, x, cols, gap=10, more_gap_each=1, more_gap_relative=0){
if (is.data.frame(x) && ncol(x)==1)
x <- as.numeric(x[, 1])
# we normalize (0 <= signal <= 1)
df <- df-min(df)
df <- (df/max(df))
# we prepare a vector of colors
if (missing(cols))
cols <- rep_len("#00000055", nrow(df))
else
cols <- rep_len(cols, nrow(df))
# we prepare gap handling. there is probably more elegant
gaps <- 1
for (i in 2:ncol(df))
gaps[i] <- gaps[i - 1] + 1/gap + ifelse((i %% more_gap_each) == 0, (1/gap)*more_gap_relative, 0)
# we initialize the plot
plot(NA, xlim=range(x), ylim=c(min(df), 1+max(gaps)), xlab="Time", ylab="", axes=FALSE, mar=rep(0, 4))
axis(1)
# finally, the lines
silent <- lapply(1:ncol(df), function(i) lines(x, df[, i] + gaps[i], col=cols[i]))
}
Мы можем использовать его (по умолчанию):
nik_plot2D(M, x) # gap=10
И вы получите этот сюжет:
или:
nik_plot2D(M, x, 50)
или, с цветами:
nik_plot2D(M, x, gap=20, cols=1:3)
nik_plot2D(M, x, gap=20, cols=rep(1:3, each=5))
или, по-прежнему с цветами и, но с большими промежутками:
nik_plot2D(M, x, gap=20, cols=terrain.colors(10), more_gap_each = 1, more_gap_relative = 0) # no gap by default
nik_plot2D(M, x, gap=20, cols=terrain.colors(10), more_gap_each = 10, more_gap_relative = 4) # large gaps every 10 lines
nik_plot2D(M, x, gap=20, cols=terrain.colors(10), more_gap_each = 5, more_gap_relative = 2) # small gaps every 5 lines
Просьба представить данные в воспроизводимом формате – adaien
Для четырех колонок это довольно просто, но я полагаю, что вы хотите применить это к большему количеству столбцов? – Laterow
nvm, получил его thx – mtoto