Как я могу получить х , Y координаты geom_point в ggplot , где опорный кадр весь график изображения?
Я могу создать ggplot с некоторыми geom_point с помощью:
library(ggplot2)
my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
geom_point(aes(x, y), color = "red")
Это дает:
Преобразовав это в гроб , я могу извлечь некоторую дополнительную информацию об этом ggplot , например, координаты относительно панели графика, отмеченные фиолетовой стрелкой. Однако это игнорирует пространство, занимаемое осями.
my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native
Как я могу получить значения координат x , y, когда я начинаю измерения из левого нижнего угла всего изображения, отмеченного зеленой стрелкой?
Если это возможно, я хотел бы решение , чтобы принять во внимание тему о ggplot . Добавление темы, подобной теме,+ theme_void()
влияет на оси, а также смещает расположение точек относительно всего построенного изображения.
Обновление : я понял, что размер шрифта осей изменяется в зависимости от ширины и высоты графика, влияя на относительный размер панели графика . Таким образом, будет не просто указать местоположение в единицах NPC без определения ширины и высоты графика . Если возможно, укажите расположение geom_points в зависимости от ширины участка и высоты участка .
Ответы:
Когда вы изменяете размер ggplot, положение элементов на панели не является фиксированным в пространстве NPC. Это связано с тем, что некоторые компоненты графика имеют фиксированные размеры, а некоторые из них (например, панель) изменяют размеры в соответствии с размером устройства.
Это означает, что любое решение должно учитывать размер устройства, и если вы хотите изменить размер графика, вам придется снова выполнить расчет. Сказав это, для большинства приложений (включая ваше, по звукам вещей) это не проблема.
Другая трудность заключается в том, чтобы убедиться, что вы идентифицируете правильные группы в панели панелей, и трудно понять, как это можно легко обобщить. Использование функций подмножества списка
[[6]]
и[[3]]
в вашем примере не распространяется на другие графики.В любом случае, это решение работает путем измерения размера и положения панели в gtable и преобразования всех размеров в миллиметры перед делением на размеры графика в миллиметрах для преобразования в пространство NPC. Я попытался сделать его более общим, выделив панель и точки по имени, а не по числовому индексу.
Теперь мы можем проверить это на вашем примере:
И мы можем подтвердить, что эти значения верны, нанося некоторые точечные значения над вашими красными точками, используя наши значения в качестве координат NPC:
Создано в 2020-03-25 пакетом представлением (v0.3.0)
источник
sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
часть самая странная. Не могли бы вы объяснить, что вы здесь суммируете?panel_pos$t
дает строку сетки, в которой расположена (гибкая) панель,seq(panel_pos$t -1)
как и все номера строк над ней, и, следовательно,sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
является суммой высот этих строк.