问题
I would like to get approximately the same result as it is shown in the example below. I hesitate between these two functions to get this result: geom_crosshair_tern
and scale_X_continuous
.
Hamilton, N. E., & Ferry, M. (2018). ggtern: Ternary Diagrams Using ggplot2. Journal of Statistical Software, 87(1), 1‑17. https://doi.org/10.18637/jss.v087.c03
Here is the script i have written until now:
points1 <- data.frame(
rbind(c( 1,45,30,25),
c( 2,33,33,34),
c( 3,15,75,10)
)
)
colnames(points1) = c("IDPoint","X","Y","Z")
#geom_crosshair_tern version
base1 = ggtern(data=points1,aes(X,Y,Z)) +
theme_bw() +
tern_limits(labels=c(20,40,60,80,100), breaks=seq(0.2,1,by=0.2)) +
theme_clockwise() +
theme_showarrows() +
labs(title = "Test",Tarrow = "% X",Larrow = "% Y",Rarrow = "% Z") +
theme(tern.axis.arrow=element_line(size=1,color="black")) +
geom_point(shape=21,size=5,col="black",bg="slategray1") +
geom_text(aes(label=IDPoint),color="black") +
geom_crosshair_tern(lty=2)
Here is what I get with geom_crosshair_tern
, but I have two issues:
- I don't know how to show the real values of my datas;
- I don't know how to put my points above the
geom_crosshair_tern
.
Is the scale_X_continuous
function more appropriate? I tried unsuccessfully the following script.
points1 <- data.frame(
rbind(c( 1,45,30,25),
c( 2,33,33,34),
c( 3,15,75,10)
)
)
colnames(points1) = c("IDPoint","X","Y","Z")
labFnc <- function(x,digits=2) format(round(unique(x),digits),digits=digits)
base1 = ggtern(data=points1,aes(X,Y,Z)) +
scale_T_continuous(breaks=unique(points1$y),labels=labFnc(points1$y)+
scale_L_continuous(breaks=unique(points1$x),labels=labFnc(points1$x)+
scale_R_continuous(breaks=unique(points1$z),labels=labFnc(points1$z)+
theme_bw() +
tern_limits(labels=c(20,40,60,80,100), breaks=seq(0.2,1,by=0.2)) +
theme_clockwise() +
theme_showarrows() +
labs(title = "Test",Tarrow = "% X",Larrow = "% Y",Rarrow = "% Z") +
theme(tern.axis.arrow=element_line(size=1,color="black")) +
geom_point(shape=21,size=5,col="black",bg="slategray1") +
geom_text(aes(label=IDPoint),color="black")
回答1:
Correct the second problem of placing the points above the geom_crosshair_tern, you needed to rearrange the order of the geometries by starting with geom_crosshair_tern and then the points.
To print outside the triangle, you need to add theme_nomask
to the plotting calls, then it is a matter of playing around with the vjust
and hjust
for the proper label placement.
library(ggtern)
points1 <- data.frame(
rbind(c( 1,45,30,25),
c( 2,33,33,34),
c( 3,15,75,10)
)
)
colnames(points1) = c("IDPoint","X","Y","Z")
labFnc <- function(x,digits=2) format(round(unique(x),digits),digits=digits)
#geom_crosshair_tern version
base2 = ggtern(data=points1,aes(X,Y,Z)) +
theme_bw() +
geom_crosshair_tern(lty=2)+
tern_limits(labels=c(20,40,60,80,100), breaks=seq(0.2,1,by=0.2)) +
theme_clockwise() +
theme_showarrows() +
theme_nomask() +
labs(title = "Test",Tarrow = "% Y",Larrow = "% X",Rarrow = "% Z") +
theme(tern.axis.arrow=element_line(size=1,color="black")) +
geom_point(shape=21,size=5,col="black",bg="slategray1") +
geom_text(aes(label=IDPoint), color="black") +
annotate(geom = 'text',
x = points1$X,
y = c(0),
z = 100-points1$X,
vjust = c(-0., -0., -0.),
hjust = c(-0.25, -0.25, -0.25),
angle = c(-60,-60,-60),
label = paste("X=",points1$X)) +
annotate(geom = 'text',
x = 100-points1$Y,
y = points1$Y,
z = c(0),
vjust = c(+0.25, 0.25, 0.25),
hjust = c(1, +1, 1),
label = paste("Y=",points1$Y)) +
annotate(geom = 'text',
x = c(0),
y = 100-points1$Z,
z = points1$Z,
vjust = c(+0.3, 0.3, 0.3),
hjust = c(-0.25, -0.25, -0.25),
angle = c(60,60,60),
label = paste("Z=",points1$Z))
print(base2)
回答2:
Here is another approach:
#Duplicate Original Data Frame
df = points1
#New Data frame
#NEW Variable to be used in text label
df$label = apply(df,1,function(row){
sprintf("[%s,%s,%s]",row[2],row[3],row[4])
})
#NEW Color Variable to be mapped
df$color = as.factor(df$IDPoint)
#NEW Fill Variable to be mapped
df$fill = as.factor(df$IDPoint)
#geom_crosshair_tern version
base2 = ggtern(data=df,aes(X,Y,Z,color=color,fill=fill)) + ## << color and fill global mappings
theme_bw() +
tern_limits(labels=c(20,40,60,80,100), breaks=seq(0.2,1,by=0.2)) +
theme_clockwise() +
theme_showarrows() +
labs(title = "Test",Tarrow = "% X",Larrow = "% Y",Rarrow = "% Z") +
theme(tern.axis.arrow=element_line(size=1,color="black")) +
geom_crosshair_tern(lty=2) + ## <<< Order brought forward, so that the crosshair is under the points
geom_point(shape=21,size=5,color='black') + ## << Black border on points
geom_text(aes(label=IDPoint),color="black") +
geom_text(aes(label=IDPoint),color="black") +
geom_text(aes(label=sprintf(" %s",label)),size=3,hjust=0) + ## << NEW Text Geometry
guides(fill='none',color='none') ## << Turn off legends for colour/fill
print(base2)
来源:https://stackoverflow.com/questions/56502899/how-can-i-show-the-real-values-of-my-datas-in-ggtern