В настоящее время tikzAnnotate
работает только с базовой графикой. Когда tikzAnnotate
был впервые написан, проблема с графикой grid
заключалась в том, что нам требовался способ указания координат x, y относительно абсолютного нижнего левого угла холста устройства. grid
мыслит в терминах областей просмотра, и во многих случаях кажется, что окончательная система координат графики неизвестна, пока она не направляется к устройству с помощью функции print
.
Было бы замечательно иметь эту функцию, но я не мог найти хороший способ реализовать ее, и поэтому эта функция была отложена. Если у кого-то есть сведения о хорошей реализации, не стесняйтесь начинать обсуждение в списке рассылки (который теперь имеет альтернативный портал в группах Google), и он попадет в список TODO.
Еще лучше реализовать функциональность и открыть запрос на извлечение проекта на GitHub . Это гарантирует, что эта функция будет выпущена в 9000 раз быстрее, чем если бы она месяцами находилась в моем списке TODO.
Обновление
У меня было время поработать над этим, и у меня появилась функция для преобразования координат сетки в текущем окне просмотра в абсолютные координаты устройства:
gridToDevice <- function(x = 0, y = 0, units = 'native') {
# Converts a coordinate pair from the current viewport to an "absolute
# location" measured in device units from the lower left corner. This is done
# by first casting to inches in the current viewport and then using the
# current.transform() matrix to obtain inches in the device canvas.
x <- convertX(unit(x, units), unitTo = 'inches', valueOnly = TRUE)
y <- convertY(unit(y, units), unitTo = 'inches', valueOnly = TRUE)
transCoords <- c(x,y,1) %*% current.transform()
transCoords <- (transCoords / transCoords[3])
return(
# Finally, cast from inches to native device units
c(
grconvertX(transCoords[1], from = 'inches', to ='device'),
grconvertY(transCoords[2], from = 'inches', to ='device')
)
)
}
Используя этот недостающий фрагмент, можно использовать tikzAnnotate
для разметки grid
или lattice
сюжета:
require(tikzDevice)
require(grid)
options(tikzLatexPackages = c(getOption('tikzLatexPackages'),
"\\usetikzlibrary{shapes.arrows}"))
tikz(standAlone=TRUE)
xs <- 15:20
ys <- 5:10
pushViewport(plotViewport())
pushViewport(dataViewport(xs,ys))
grobs <- gList(grid.rect(),grid.xaxis(),grid.yaxis(),grid.points(xs, ys))
coords <- gridToDevice(17, 7)
tikzAnnotate(paste('\\node[single arrow,anchor=tip,draw,fill=green,left=1em]',
'at (', coords[1],',',coords[2],') {Look over here!};'))
dev.off()
Это дает следующий вывод:
Еще предстоит проделать определенную работу, например:
Создание "аннотации", которая может быть добавлена к сетке графики.
Определите, как добавить такой объект в ggplot
.
Эти функции должны появиться в версии 0.7 из tikzDevice
.