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

avatar
Richard N. Belcher
8 апреля 2018 в 09:30
1893
1
7

Я использую 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))

enter image description here

Есть ли способ сделать это? Мы будем очень признательны за любую помощь.

Редактировать: я также пытался добавить аргумент 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)

enter image description here

Источник
Nicholas Hamilton
9 апреля 2018 в 08:30
1

ggtern.com/d/2.2.2/tern_limits.html

Richard N. Belcher
9 апреля 2018 в 09:05
0

Николас, спасибо за комментарий, кстати, это отличный пакет. Я пытался использовать tern_limits, но он помещает все мои данные в середину графика. Я обновил свой вопрос с этой информацией.

Nicholas Hamilton
11 апреля 2018 в 02:29
0

Ожидается, что аргументы в limit_tern(...) будут дробными, то есть [0,1], я приведу пример.

Ответы (1)

avatar
Nicholas Hamilton
11 апреля 2018 в 02:41
7

Предоставленное вами решение находится на правильном пути, однако все аргументы функции 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])
Richard N. Belcher
11 апреля 2018 в 04:34
0

Спасибо, Николай, теперь я понимаю, что вам нужно выполнить симплексные условия. Другой момент — это метки осей. Я могу понять, что точка может иметь значение% в своем диапазоне. Скажем, одна точка расположена на X 10%, но на самом деле точка данных равна 2,4. Есть ли способ легко изменить маркировку оси, чтобы галочка стояла на значении 10%, но в тексте отображается 2,4 (вместо 10%). ? Это можно сделать вручную в inkscape, используя подход, аналогичный ссылке, которую я разместил в вопросе.

Nicholas Hamilton
11 апреля 2018 в 05:03
1

@RichardN.Belcher, я привел пример полной настройки.