Странная интерпретация единичного выражения в сетке - PullRequest
1 голос
/ 26 июня 2019

Я делаю графику, используя сетку, и хочу нарисовать текст.Я столкнулся с проблемой при указании координат текста.

В частности, я обнаружил, что могу использовать как прямую единицу, такую ​​как unit(1, "native"), так и выражение, которое оценивается как единицу, такое как unit(1, "native") + unit(1, "mm").Но как только в выражении появятся две собственные единицы измерения, текст выводится не там, где я его ожидаю, а в позиции, которая может использовать единицы npc.

В следующем MWE я бы ожидал "3"быть напечатанным справа от середины (0 в нативных единицах), но это напечатано далеко налево.

 require(grid)

grid.newpage()
vp.data.region <- viewport(x = unit(0.5, "npc"), y = unit(0.5, "npc"), width = unit(0.8, "npc"), height = unit(0.8, "npc"), xscale=c(-1,1), yscale=c(-1,1), name = "data region")
pushViewport(vp.data.region)
grid.xaxis()
grid.yaxis()

grid.text("1", unit(0, "native"),unit(0, "native")) #places the text where it should be
grid.text("2", unit(0, "native") + unit(10, "mm"), unit(0, "native")) # it is possible to use an expression adding mixed units 
grid.text("3", unit(0.6, "native") - unit(0.5, "native") + unit(1, "mm") , unit(0, "native")) # suddenly, it looks like the unit expression is being interpreted as npc?

enter image description here

В чем причина этой проблемы и как ее избежать?Обратите внимание, что было бы очень трудно указать единицу с одним выражением, потому что я начинаю с точки, уже указанной как собственные единицы измерения плюс несколько миллиметров, и мне нужно расположить текст на некотором расстоянии от него, которое я должен снова вычислить, используяи родные единицы и миллиметры.

1 Ответ

1 голос
/ 26 июня 2019

В основном основными единицами для расчета являются npc единицы. Когда происходит сложение / вычитание, каждое значение преобразуется в npc единиц. Мы можем использовать функцию convertX, чтобы увидеть, как получаются эти значения. Когда вы используете собственные единицы измерения, эти значения отображаются на npc единицы с помощью значений xscale=. Обратите внимание, что

convertX(unit(0.6, "native"), "npc")
# [1] 0.8npc
convertX(unit(0.5, "native"), "npc")
# [1] 0.75npc
convertX(unit(0.6, "native") - unit(0.5, "native"), "npc")
# [1] 0.0499999999999999npc

по сравнению с

convertX(unit(0.1, "native"), "npc")
# [1] 0.55npc

Вы не можете выполнять атриметику в собственном пространстве, используя npc координаты. Если вам нужно вычислить 0,5 нативных единиц слева от 0,6, то вам нужно сделать это арифметическое в нативном пространстве

convertX(unit(0.6 - 0.5, "native"), "npc")
# [1] 0.55npc

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

nativeShift <- function(unit, shift) {
  stopifnot(class(unit)=="unit")
  stopifnot(attr(unit, "unit")=="native")
  stopifnot(is.numeric(shift))
  unit(unclass(unit) + shift, "native")
}

convertX(nativeShift(unit(.6, "native"), -.5), "npc")
# [1] 0.55npc

С вашим примером построения, который будет выглядеть как

grid.text("3", nativeShift(unit(0.6, "native"), -0.5) + unit(1, "mm") , unit(0, "native"))
...