Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何向图形中添加大括号?_R_Graph - Fatal编程技术网

R 如何向图形中添加大括号?

R 如何向图形中添加大括号?,r,graph,R,Graph,我想在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,

我想在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,y1=.5,x2=.5,y2=1,curvature=.5)
   grid.curve(x2=1,y2=0,x1=.875,y1=.5,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()}
库(网格)
#函数以红色绘制大括号
#x1…y2是支架的末端
#对于倒置支架,x1>x2和y1>y2

像这样的怎么样

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,0,ylim=c(-10,10),xlim=c(-10,10))
CurlyBraces(2, 0, 10, pos = 1, direction = 1 )
CurlyBraces(2, 0, 5,  pos = 1, direction = 2 )
CurlyBraces(1, 0, 10, pos = 2, direction = 1 )
CurlyBraces(1, 0, 5,  pos = 2, direction = 2 )
#创建花括号的函数
#x,y放置支架的位置
#范围是宽度
#位置:1垂直,2水平
#方向:1左/下,2右/上

CurlyBraces我认为
pBrackets
包是最优雅的解决方案

要使用默认的绘图功能
plot
,请查看软件包的渐晕图以获取示例

它们不显示带有
ggplot2
的示例。您可以尝试将我的代码用于
ggplot2
图形

最好的,
平移

带有旋转选项/和所需的每行()又名par()选项

我首先混淆了Sharons的答案,然后用另一个答案找到了一个更具可能性的新函数。但是后来我在游戏中添加了“形状”包,现在你可以在你想要的任何角度放置卷发。你不必使用这个包,但是如果你有两个不在水平或垂直线上的点,如果没有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,100)
    b_sequence = seq(y-range/2,y+range/2,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,y1,length=100)  
    }
    if (pos == 2){
      b_sequence = seq(x,x1,length=100)
      a_sequence = seq(y,y1,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, lwd=lwd, col=col, lty=lty, 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,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 * 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,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(),ylim=c(-10,10),xlim=c(-10,10))
# grid()
# 
# CurlyBraces(4,-2,4,2, opt.lines = "lty=1,col='blue' ,lwd=2")
# CurlyBraces(4,2,2,4, opt.lines = "col=2, lty=1 ,lwd=0.5")
# points(3,3)
# segments(4,2,2,4,lty =  2)
# segments(3,3,4,4,lty =  2)
# segments(4,2,5,3,lty =  2)
# segments(2,4,3,5,lty =  2)
# CurlyBraces(2,4,4,2, opt.lines = "col=2, lty=2 ,lwd=0.5") # Reverse entry of datapoints changes direction of brace
# 
# CurlyBraces(2,4,-2,4, opt.lines = "col=3 , lty=1 ,lwd=0.5")
# CurlyBraces(-2,4,-4,2, opt.lines = "col=4 , lty=1 ,lwd=0.5")
# CurlyBraces(-4,2,-4,-2, opt.lines = "col=5 , lty=1 ,lwd=0.5")
# CurlyBraces(-4,-2,-2,-4, opt.lines = "col=6 , lty=1 ,lwd=0.5")
# CurlyBraces(-2,-4,2,-4, opt.lines = "col=7 , lty=1 ,lwd=0.5")
# CurlyBraces(2,-4,4,-2, opt.lines = "col=8 , lty=1 ,lwd=0.5")
# 
# CurlyBraces( 7.5, 0, ang= 0 , range=5, opt.lines = "col=1 , lty=1 ,lwd=2 " )
# CurlyBraces( 5, 5, ang= 45 , range=5, opt.lines = "col=2 , lty=1 ,lwd=2 " )
# CurlyBraces( 0, 7.5, ang= 90 , range=5, opt.lines = "col=3, lty=1 ,lwd=2"  )
# CurlyBraces( -5, 5, ang= 135 , range=5, opt.lines = "col='blue' , lty=1 ,lwd=2 " )
# CurlyBraces( -7.5, 0, ang= 180 , range=5, opt.lines = "col=5 , lty=1 ,lwd=2 " )
# CurlyBraces( -5, -5, ang= 225 , range=5, opt.lines = "col=6 , lty=1 ,lwd=2"  )
# CurlyBraces( 0, -7.5, ang= 270 , range=5, opt.lines = "col=7, lty=1 ,lwd=2"  )
# CurlyBraces( 5, -5, ang= 315 , range=5, opt.lines = "col=8 , lty=1 ,lwd=2"  )
# points(5,5)
# segments(5,5,6,6,lty =  2)
# segments(7,3,3,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 , opt.lines = "col='blue' , depth=1, lty=1 ,lwd=2"  )
# locator(2) -> where  # klick 2 positions in the plot with your Mouse
# CurlyBraces( where$x[1], where$y[1], where$x[2], where$y[2],  opt.lines = "col='blue' , depth=2, lty=1 ,lwd=2"  )
# 
# # Some Examples with shape == F
# plot(c(),c(),ylim=c(-10,10),xlim=c(-10,10))
# grid()
# 
# CurlyBraces( 5, 0, shape=F, range= 10, pos = 1, direction = 1 , depth=5 ,opt.lines = " col='red' , lty=1 ,lwd=2"  )
# CurlyBraces(-5, 0, shape=F,  range= 5,  pos = 1, direction = 2 , opt.lines = "col='red' , lty=2 ,lwd=0.5")
# CurlyBraces( 1, 4, shape=F,  range= 6,  pos = 2, direction = 1 , opt.lines = "col='red' , lty=3 ,lwd=1.5")
# CurlyBraces(-1,-3, shape=F,  range= 5,  pos = 2, direction = 2 , opt.lines = "col='red' , lty=4 ,lwd=2"  )
# 
# 
# CurlyBraces( 4, 4, 4,-4, shape=F, pos=1, direction = 1 , opt.lines = "col='blue' , lty=1 ,lwd=2" )
# CurlyBraces(-4, 4,-4,-4, shape=F, pos=1, direction = 2 , opt.lines = "col='blue' , lty=2 ,lwd=0.5")
# CurlyBraces(-2, 5, 2, 5, shape=F, pos=2, direction = 1 , opt.lines = "col='blue' , lty=3 ,lwd=1.5")
# CurlyBraces(-2,-1, 4,-1, shape=F, pos=2, direction = 2 , opt.lines = "col='blue' , lty=4 ,lwd=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, shape=F, pos=2, direction = 2 , opt.lines = "col='blue' , depth=1, lty=1 ,lwd=2"  )
# locator(2) -> where  # klick 2 positions in the plot with your Mouse
# CurlyBraces( where$x[1], where$y[1], where$x[2], where$y[2], shape=F, pos=2, direction = 2 , opt.lines = "col='blue' , depth=0.2, lty=1 ,lwd=2"  )
# 
# # Some Examples with shape==T
# plot(c(),c(),ylim=c(-100,100),xlim=c(-1,1))
# grid()
# 
# CurlyBraces(.4,-20,.4,20, depth=.1, opt.lines = "col=1 , lty=1 ,lwd=0.5")
# CurlyBraces(.4,20,.2,40, depth=.1, opt.lines = "col=2, lty=1 ,lwd=0.5")
CurlyBraces,其中#klick用鼠标在绘图中选择两个位置
#卷曲曲线(其中$x[1],其中$y[1],其中$x[2],其中$y[2],形状=F,位置=2,方向=2,opt.lines=“col='blue',depth=0.2,lty=1,lwd=2”)
# 
##一些shape==T的示例
#绘图(c(),c(),ylim=c(-100100),xlim=c(-1,1))
#网格()
# 
#卷曲曲线(.4,-20,4,20,深度=.1,opt.lines=“col=1,lty=1,lwd=0.5”)
#卷曲曲线(.4,20,2,40,深度=.1,opt.lines=“col=2,lty=1,lwd=0.5”)

很晚才回答,但是对于那些感兴趣的人,您可以使用ggbrace包在ggplot2中添加大括号。要安装和使用它,请检查下面的代码。您可以根据需要自定义括号,请参见


看起来您尝试添加图像但失败了。您可能会看到(我不会将此作为答案发布,因为要使底种族正确间隔/与所示点对齐需要更多的麻烦…)这将是一个很好的解决方案,但根据网格包文档,“网格图形和标准R图形不能混合使用!“这是非常不幸的。我使用了John提供的文本解决方案,但对于较大的括号来说没有那么好。我有一个类似的问题,这是迄今为止我遇到的最简单的方法。但是,该软件包的一个限制是,括号的尺寸是由x轴和y轴的尺寸设置的。例如,如果你有一个y轴s以100为增量,x轴以1为增量,您的曲线看起来会有点扭曲。有趣的是,我无法用
ggplot2
正确打印。我使用了
+注释(“text”,x=0,y=0,label='{',angle=90,size=20,family='Helvetica Neue UltraLight')上的变体
。大括号在PDF输出中显示得很厚(在RStudio控制台中看起来不错)。
devtools::install_github("NicolasH2/ggbrace")
library(ggbrace)
library(ggplot2)

ggplot() + geom_brace(aes(x=c(0,1), y=c(0,1)))