Создание линейного графика со шкалой времени и метками в r
Я пытаюсь создать сюжет, подобный следующему (много раз я в конечном итоге рисую такой сюжет вручную, но на этот раз я хочу построить его сам).
Вот мои данные и мое испытание:
myd <- data.frame (period = c("Triassic", "Jurasic",
"Cretaceous", "Cenzoic"), myears = c(245, 208, 145, 65),
label = c(226, 176,105, 32 ))
myd2 <- data.frame (event = c("Diansaurs_strt", "Birds",
"Diansaurs_ext", "Human"), myears = c(235, 200, 60, 0.5))
myd2$x <- -0.25
with (myd2, plot(x,myears,ylim=c(0,250),
xlim = c(0, 10), axes=F,xlab="",ylab="",type="p",pch=17))
with (myd2,text(x,myears,event,pos=4,xpd=T))
axis(side=2,at = myd$label, labels = myd$period)
У меня есть проблемы, в частности, совпадение оси с сюжетом и ориентацией текста и точек. Любая другая идея или улучшение помощи оценены.
4 ответа:
Для построения новых сюжетов "с нуля", а также для максимального контроля над отдельными графическими элементами, графическая системаgrid трудно превзойти:
library(grid) ## Set up plotting area with reasonable x-y limits ## and a "native" scale related to the scale of the data. x <- -1:1 y <- extendrange(c(myd$myears, myd2$myears)) dvp <- dataViewport(x, y, name = "figure") grid.newpage() pushViewport(dvp) ## Plot the central timeline grid.lines(unit(0, "native"), unit(c(0,245), "native"), gp = gpar(col="dodgerblue")) ## Annotate LHS grid.segments(x0=0.5, x1=0.47, y0=unit(c(0, myd$myears), "native"), y1=unit(c(0, myd$myears), "native"), gp=gpar(col="dodgerblue")) grid.text(label=c(0, myd$myears), x=0.44, y=unit(c(0, myd$myears), "native")) grid.text(label=myd$period, x=0.3, y=unit(myd$label, "native"), just=0, gp=gpar(col="dodgerblue", fontface="italic")) ## Annotate RHS ## Create a function that plots a pointer to the specified coordinate pointer <- function(x, y, width=1) { grid.polygon(x = x + unit(width*(c(0, .1, .1)), "npc"), y = y + unit(width*(c(0, .03, -.03)), "npc"), gp = gpar(fill="dodgerblue", col="blue", lwd=2)) } ## Call it once for each milestone for(y in myd2$myears) { pointer(unit(.5, "npc"), y=unit(y, "native"), width=0.3) } ## Or, if you just want blue line segments instead of those gaudy pointers: ## grid.segments(x0=0.5, x1=0.53, ## y0=unit(c(myd2$myears), "native"), ## y1=unit(c(myd2$myears), "native"), gp=gpar(col="dodgerblue")) grid.text(label=myd2$event, x=0.55, y=unit(myd2$myears, "native"), just=0)
Вы можете попробовать что-то вроде этого, чтобы начать работу:
myd <- data.frame(period = c("", "Triassic", "Jurasic", "Cretaceous", "Cenzoic", ""), myears = c(260, 245, 208, 145, 65, -5), label = c(260, 226, 176,105, 32, -5)) myd2 <- data.frame(event = c("Dinosaurs_strt", "Birds", "Dinosaurs_ext", "Human"), myears = c(235, 200, 60, 0.5)) myd2$x <- 1 with(myd2, plot(x, myears, ylim = c(-5, 250), xlim = c(0, 10), axes = FALSE, xlab = "", ylab = "", type = "n")) with(myd2, text(x, myears, event, pos = 4, xpd = TRUE)) axis(side = 2, at = myd$label, labels = myd$period, las = 2) X0 <- rep(myd2$x, 4) Y0 <- myd2$myears X1 <- rep(-.25, 4) Y1 <- Y0 arrows(X0, Y0, X1, Y1)
Я добавил дополнительный пустой элемент в начале и конце ваших данных в "myd", чтобы помочь с осью. Затем, вместо использования
pch
, я использовалarrows
, чтобы сопоставить правые метки с осью.Некоторые настройки, вероятно, могли бы сделать его намного лучше.
Вот некоторые улучшения ( я предлагаю добавить 0 сейчас, просто чтобы сделать масштаб хорошо):
myd <- data.frame (period = c("Triassic", "Jurasic", "Cretaceous", "Cenzoic", "now"), myears = c(245, 208, 145, 65, 0), label = c(226, 176,105, 32, NA )) myd2 <- data.frame (event = c("Diansaurs_strt", "Birds", "Diansaurs_ext", "Human"), myears = c(235, 200, 60, 0.5)) myd2$x <- -0.25 with (myd2, plot(x,myears,ylim=c(0,250), xlim = c(0, 10), axes=F,xlab="",ylab="",type="p",pch=17, col = "green")) with (myd2, plot(x,myears,ylim=c(0,250), xlim = c(0, 10), axes=F,xlab="",ylab="",type="p",pch="-", col = "green")) with (myd2,text(x,myears,event,pos=4,xpd=T), col = "green") axis(side=2,at = myd$label, labels = myd$period, tick = FALSE, las = 2, col = "green", ) axis(side=2,at = myd$myears, labels = myd$myears, las = 2, col = "green")
Осталось немного вопросов, которые вы можете изменить ориентацию стрелки (я верю, что вы можете каким - то образом найти
Для рисования треугольников посмотрите на функции
my.symbols
иms.polygon
в пакете TeachingDemos.В вашем правом графике выше динозавры перемещаются вверх, если вы хотите этого в целом (перемещение меток, которые в противном случае были бы слишком близки или перекрываются), то посмотрите на функцию
spread.labs
в пакете TeachingDemos.Некоторые другие возможные функции, которые могли бы помочь с сюжетом:
text
,mtext
,grconvertX
,grconvertY
,segments
, иaxis
.