Как использовать диапазон осей и метки из исходных данных в ggtern?

Я использую ggtern в R для создания троичного графика и хотел бы, чтобы на моем графике ggtern были метки и разрывы оси, такие же, как у исходных данных. В случае сгенерированных данных в приведенном ниже коде каждая ось будет максимум до 12, 10 и 4.

После предыдущего поста я попытался использовать для этого разрывы и метки, но каждая ось по-прежнему находится в масштабе 0-1, метки отсутствуют (из-за того, что они больше 1), а линии осей с метками не пересекают точки на участке. ( Как изменить метки троичного участка, сделанные ggtern?)

library(ggtern)
labFnc <- function(x,digits=2) format(round(unique(x),digits),digits=digits)

mydata <- data.frame(
  x = runif(50, min = 0.25, max = 12),
  y = runif(50, min = 0.1, max = 10),
  z = runif(50, min = 0.5, max = 4),
  value = runif(50, min = 10000, max = 20000))

ggtern(data = mydata,aes(x = x, y = y, z = z,col=value)) + 
  theme_bw() +
  geom_point(alpha = 0.8, size = 3) +
  theme_showarrows() +
  scale_T_continuous(breaks=unique(mydata$x),labels=labFnc(mydata$x))+ 
  scale_L_continuous(breaks=unique(mydata$y),labels=labFnc(mydata$y))+ 
  scale_R_continuous(breaks=unique(mydata$z),labels=labFnc(mydata$z))

введите описание изображения здесь

Есть ли способ сделать это? Любая помощь будет принята с благодарностью.

Изменить: я также попытался добавить в аргумент tern_limits. Хотя это выглядит для пропорционального расширения графика, данные находятся не в том месте. и я не могу добавить в свои уникальные перерывы, как раньше.

ggtern(data = mydata,aes(x = x, y = y, z = z,col=value)) + 
  theme_bw() +
  geom_point(alpha = 0.8, size = 3) +
  theme_showarrows() +
  tern_limits(T=12, L=10, R=4)

введите описание изображения здесь

1 ответ

Решение

Решение, которое вы предоставили, идет по правильному пути, однако все аргументы limit_term(...) Ожидается, что функция (или псевдонимы) будет в диапазоне [0,1], что соответствует [0,100%]. Значения могут быть предоставлены за пределами этого диапазона, однако это будет способствовать разрешению ограничений, которые будут содержать значения больше 100% и меньше 0%.

В итоге, используйте следующее:

tern_limits(T=12, L=10, R=4)

на самом деле просит, чтобы троичные пределы были ограничены максимумами 1200%, 1000% и 400% соответственно, что в точности соответствует полученному вами результату.

Во всяком случае, вот несколько примеров limits_tern а также zoom функциональность.

library(ggtern)

n  = 100
df = data.frame(id=1:n,
                x=runif(n),
                y=runif(n),
                z=runif(n))
base = ggtern(df,aes(x,y,z,color=id)) + geom_point(size=3)
base

#Top Corner
base + limit_tern(1.0,0.5,0.5)

#Left Corner
base + limit_tern(0.5,1.0,0.5)

#Right Corner
base + limit_tern(0.5,0.5,1.0)

#Center Zoom Convenience Function
base + theme_zoom_center(0.4) # Zoom In
base + theme_zoom_center(0.6) # Zoom In
base + theme_zoom_center(0.8) # Zoom In
base + theme_zoom_center(1.0) ##Default as per no zoom
base + theme_zoom_center(1.2) # Zoom Out
base + theme_zoom_center(1.4) # Zoom Out
base + theme_zoom_center(1.6) # Zoom Out
base + theme_zoom_center(1.8) # Zoom Out
base + theme_zoom_center(2.0) # Zoom Out

#Left Zoom Convenience Function 
#   (try theme_zoom_R and theme_zoom_T for Right and Top respectively)
base + theme_zoom_L(0.4) # Zoom In
base + theme_zoom_L(0.6) # Zoom In
base + theme_zoom_L(0.8) # Zoom In
base + theme_zoom_L(1.0) ##Default as per no zoom
base + theme_zoom_L(1.2) # Zoom Out
base + theme_zoom_L(1.4) # Zoom Out
base + theme_zoom_L(1.6) # Zoom Out
base + theme_zoom_L(1.8) # Zoom Out
base + theme_zoom_L(2.0) # Zoom Out

Обратите внимание: все эти вспомогательные функции упрощают масштабирование, а не управляют пределами независимо (что является действительным) с помощью scale_X_continuous(...) [X = T,L,R]. В отличие от чисто декартовой системы координат, где x и y независимы, в троичной системе ограничения должны иметь смысл, чтобы три точки вершины удовлетворяли условиям симплекса.

Если вам необходимо управлять каждой осью независимо, здесь ниже приведен пример, где определены все пределы, разрывы осей и метки осей для осей T, L и R соответственно. Если пределы бессмысленны с точки зрения симплексных условий, будет сгенерирована ошибка.

ggtern() + 
  scale_T_continuous(limits=c(0.5,1.0),
                     breaks=seq(0,1,by=0.1),
                     labels=LETTERS[1:11]) + 
  scale_L_continuous(limits=c(0.0,0.5),
                     breaks=seq(0,1,by=0.1),
                     labels=LETTERS[1:11]) +
  scale_R_continuous(limits=c(0.0,0.5),
                     breaks=seq(0,1,by=0.1),
                     labels=LETTERS[1:11])
Другие вопросы по тегам