微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在图表中添加大括号?

如何解决如何在图表中添加大括号?

| 我想在R中制作以下图形: 如何绘制这些水平括号?     

解决方法

        稍加谷歌搜索就可以从此处的R帮助邮件列表中的线程中获取一些网格代码。至少它为您提供了一些需要配合的东西。这是该帖子中的代码:
library(grid)

# function to draw curly braces in red
# x1...y2 are the ends of the brace
# for upside down braces,x1 > x2 and y1 > y2
Brack <- function(x1,y1,x2,y2,h)
{
   x2 <- x2-x1; y2 <- y2-y1
   v1 <- viewport(x=x1,y=y1,width=sqrt(x2^2+y2^2),height=h,angle=180*atan2(y2,x2)/pi,just=c(\"left\",\"bottom\"),gp=gpar(col=\"red\"))
   pushViewport(v1)
   grid.curve(x2=0,y2=0,x1=.125,y1=.5,curvature=.5)
   grid.move.to(.125,.5)
   grid.line.to(.375,.5)
   grid.curve(x1=.375,x2=.5,y2=1,curvature=.5)
   grid.curve(x2=1,x1=.875,curvature=-.5)
   grid.move.to(.875,.5)
   grid.line.to(.625,.5)
   grid.curve(x2=.625,y2=.5,x1=.5,y1=1,curvature=.5)
   popViewport()}
    ,        这样的事情怎么样?
plot(c(0,1),c(0,1))
text(x = 0.5,y = 0.5,\'{\',srt = 90,cex = 8,family = \'Helvetica Neue UltraLight\')
使其适应您的目的。您可能会找到较轻的字体或更喜欢的形状。如果您进行在线搜索,则有细线字体。     ,        或这个:
# Function to create curly braces
# x,y position where to put the braces
# range is the widht
# position: 1 vertical,2 horizontal
# direction: 1 left/down,2 right/up
CurlyBraces <- function(x,y,range,pos = 1,direction = 1 ) {

    a=c(1,2,3,48,50)    # set flexion point for spline
    b=c(0,.2,.28,.7,.8) # set depth for spline flexion point

    curve = spline(a,b,n = 50,method = \"natural\")$y / 2 

    curve = c(curve,rev(curve))

    a_sequence = rep(x,100)
    b_sequence = seq(y-range/2,y+range/2,length=100)  

    # direction
    if(direction==1)
    a_sequence = a_sequence+curve
    if(direction==2)
    a_sequence = a_sequence-curve

    # pos
    if(pos==1)
    lines(a_sequence,b_sequence) # vertical
    if(pos==2)
    lines(b_sequence,a_sequence) # horizontal

    }

plot(0,ylim=c(-10,10),xlim=c(-10,10))
CurlyBraces(2,10,direction = 1 )
CurlyBraces(2,5,direction = 2 )
CurlyBraces(1,pos = 2,direction = 1 )
CurlyBraces(1,direction = 2 )
    ,        我认为“ 3”封装是最优雅的解决方案。 要使用默认的绘图功能
plot
进行尝试,请查看软件包的插图以获取示例。 他们没有显示带有ѭ5的示例。您可以在stackoverflow上尝试我的代码,以将其与
ggplot2
图一起使用。 最好, 潘基尔     ,        使用旋转选项/并且您想要的每个lines()aka par()选项 首先,我将Sharons答案与其他答案混合在一起,发现新功能具有更多可能性。但是后来我在游戏中添加了“ shape”包,现在您可以将花括号放在想要的每个角度了。您不必使用该程序包,但是如果u有2个不在水平或垂直线上的点,则将非常难看,没有shape == T。
CurlyBraces <- function(
  # function to draw curly braces
  x=NA,y=NA,# Option 1 (Midpoint) if you enter only x,y the position points the middle of the braces
  x1=NA,y1=NA,# Option 2 (Point to Point) if you additionaly enter x1,y1 then x,y become one
                  #     end of the brace and x1,y1 is the other end
  range=NA,# (Option 1 only) range is the length of the brace 
  ang=0,# (Option 1 only,only with shape==T) ang will set the angle for rotation
  depth = 1,# depth controls width of the shape
  shape=T,# use of package \"shape\" necessary for angles other than 0 and 90
  pos=1,# (only if shape==F) position: 1 vertical,2 horizontal
  direction=1,# (only if shape==F)  direction: 1 left/down,2 right/up
  opt.lines=\"lty=1,lwd=2,col=\'red\'\")   # All posible Options for lines from par (exept: xpd)
                  # enter as 1 character string or as character vector
  {

 if(shape==F){
  # only x & y are given so range is for length
  if(is.na(x1) | is.na(y1)){
    a_sequence = rep(x,length=100)
    if (pos == 2){
      a_sequence = rep(y,100)
      b_sequence = seq(x-range/2,x+range/2,length=100)
    }
  }
  # 2 pairs of coordinates are given range is not needed
  if(!is.na(x1) & !is.na(y1)){
    if (pos == 1){
      a_sequence = seq(x,x1,length=100)
      b_sequence = seq(y,length=100)  
    }
    if (pos == 2){
      b_sequence = seq(x,length=100)
      a_sequence = seq(y,length=100)      
    }
  }  
  # direction
  if(direction==1)
    a_sequence = a_sequence+curve
  if(direction==2)
    a_sequence = a_sequence-curve

  # pos
  if(pos==1)
    lines(a_sequence,b_sequence,lwd=lwd,col=col,lty=lty,xpd=NA) # vertical
  if(pos==2)
    lines(b_sequence,a_sequence,xpd=NA) # horizontal
}
 if(shape==T) {
  # Enable input of variables of length 2 or 4
  if(!(\"shape\" %in% installed.packages())) install.packages(\"shape\")
  library(\"shape\")

  if(length(x)==2) {
    helpx <- x
    x<-helpx[1]
    y<-helpx[2]}
  if(length(x)==4) {
    helpx <- x
    x =helpx[1]
    y =helpx[2]
    x1=helpx[3]
    y1=helpx[4]
  }

  # Check input
  if((is.na(x) | is.na(y) )) stop(\"Set x & y\")
  if((!is.na(x1) & is.na(y1)) | ((is.na(x1) & !is.na(y1))))stop(\"Set x1 & y1\")
  if((is.na(x1) & is.na(y1)) & is.na(range)) stop(\"Set range > 0\")

  a=c(1,50)    # set flexion point for spline
  b=c(0,.8) # set depth for spline flexion point

  curve = spline(a,method = \"natural\")$y * depth
  curve = c(curve,rev(curve))

  if(!is.na(x1) & !is.na(y1)){
    ang=atan2(y1-y,x1-x)*180/pi-90
    range = sqrt(sum((c(x,y) - c(x1,y1)) ^ 2))
    x = (x + x1)/2
    y = (y + y1)/2
  }

  a_sequence = rep(x,100)+curve
  b_sequence = seq(y-range/2,length=100)

  eval(parse(text=paste(\"lines(rotatexy(cbind(a_sequence,b_sequence),mid=c(x,y),angle =ang ),\",paste(opt.lines,collapse = \",\"),xpd=NA)\")))
 }
}


# # Some Examples with shape==T
# plot(c(),c(),10))
# grid()
# 
# CurlyBraces(4,-2,4,opt.lines = \"lty=1,col=\'blue\',lwd=2\")
# CurlyBraces(4,opt.lines = \"col=2,lty=1,lwd=0.5\")
# points(3,3)
# segments(4,lty =  2)
# segments(3,lty =  2)
# segments(4,lty =  2)
# segments(2,lty =  2)
# CurlyBraces(2,lty=2,lwd=0.5\") # Reverse entry of datapoints changes direction of brace
# 
# CurlyBraces(2,opt.lines = \"col=3,lwd=0.5\")
# CurlyBraces(-2,-4,opt.lines = \"col=4,lwd=0.5\")
# CurlyBraces(-4,opt.lines = \"col=5,opt.lines = \"col=6,opt.lines = \"col=7,lwd=0.5\")
# CurlyBraces(2,opt.lines = \"col=8,lwd=0.5\")
# 
# CurlyBraces( 7.5,ang= 0,range=5,opt.lines = \"col=1,lwd=2 \" )
# CurlyBraces( 5,ang= 45,lwd=2 \" )
# CurlyBraces( 0,7.5,ang= 90,lwd=2\"  )
# CurlyBraces( -5,ang= 135,opt.lines = \"col=\'blue\',lwd=2 \" )
# CurlyBraces( -7.5,ang= 180,lwd=2 \" )
# CurlyBraces( -5,-5,ang= 225,lwd=2\"  )
# CurlyBraces( 0,-7.5,ang= 270,lwd=2\"  )
# CurlyBraces( 5,ang= 315,lwd=2\"  )
# points(5,5)
# segments(5,6,lty =  2)
# segments(7,7,lty =  2)
# 
# # Or anywhere you klick
# locator(1) -> where  # klick 1 positions in the plot with your Mouse
# CurlyBraces( where$x[1],where$y[1],range=3,ang=45,depth=1,lwd=2\"  )
# locator(2) -> where  # klick 2 positions in the plot with your Mouse
# CurlyBraces( where$x[1],where$x[2],where$y[2],depth=2,lwd=2\"  )
# 
# # Some Examples with shape == F
# plot(c(),10))
# grid()
# 
# CurlyBraces( 5,shape=F,range= 10,direction = 1,depth=5,opt.lines = \" col=\'red\',lwd=2\"  )
# CurlyBraces(-5,range= 5,direction = 2,opt.lines = \"col=\'red\',lwd=0.5\")
# CurlyBraces( 1,range= 6,lty=3,lwd=1.5\")
# CurlyBraces(-1,-3,lty=4,lwd=2\"  )
# 
# 
# CurlyBraces( 4,pos=1,lwd=2\" )
# CurlyBraces(-4,pos=2,lwd=1.5\")
# CurlyBraces(-2,-1,lwd=2\"  )
# 
# # Or anywhere you klick
# locator(1) -> where  # klick 1 positions in the plot with your Mouse
# CurlyBraces( where$x[1],depth=0.2,lwd=2\"  )
# 
# # Some Examples with shape==T
# plot(c(),ylim=c(-100,100),xlim=c(-1,1))
# grid()
# 
# CurlyBraces(.4,-20,.4,20,depth=.1,lwd=0.5\")
# CurlyBraces(.4,40,lwd=0.5\")
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。