在answering a recent visualization问题中我真的需要大括号来显示轴上的跨度,我无法弄清楚如何在ggplot2中执行此操作。这是情节:
而不是刻度线,我真的很喜欢y轴标签“双字母名称的第二个字母”,以便从1到10(红色和蓝色第二个字母的垂直跨度)延伸。但我不确定如何实现这一目标。 x轴可以从类似的治疗中受益。
代码在链接的CrossValidated问题中可用(并且对于此示例而言不必要地复杂,因此我不会显示它)。相反,这是一个最小的例子:
library(ggplot2)
x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)
qplot(x=x,y=y) +
scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") )
在这种情况下,低类型的(0,1)和高类型的(2,3)的大括号将是理想的而不是刻度线。
我宁愿不使用geom_rect
,因为:
我将如何做到这一点?完美的答案是:
breaks
中的scale_x_continuous
选项的范围类型对象)答案 0 :(得分:18)
使用绘制大括号的函数的另一种解决方案。
谢谢Gur!
curly <- function(N = 100, Tilt = 1, Long = 2, scale = 0.1, xcent = 0.5,
ycent = 0.5, theta = 0, col = 1, lwd = 1, grid = FALSE){
# N determines how many points in each curve
# Tilt is the ratio between the axis in the ellipse
# defining the curliness of each curve
# Long is the length of the straight line in the curly brackets
# in units of the projection of the curly brackets in this dimension
# 2*scale is the absolute size of the projection of the curly brackets
# in the y dimension (when theta=0)
# xcent is the location center of the x axis of the curly brackets
# ycent is the location center of the y axis of the curly brackets
# theta is the angle (in radians) of the curly brackets orientation
# col and lwd are passed to points/grid.lines
ymin <- scale / Tilt
y2 <- ymin * Long
i <- seq(0, pi/2, length.out = N)
x <- c(ymin * Tilt * (sin(i)-1),
seq(0,0, length.out = 2),
ymin * (Tilt * (1 - sin(rev(i)))),
ymin * (Tilt * (1 - sin(i))),
seq(0,0, length.out = 2),
ymin * Tilt * (sin(rev(i)) - 1))
y <- c(-cos(i) * ymin,
c(0,y2),
y2 + (cos(rev(i))) * ymin,
y2 + (2 - cos(i)) * ymin,
c(y2 + 2 * ymin, 2 * y2 + 2 * ymin),
2 * y2 + 2 * ymin + cos(rev(i)) * ymin)
x <- x + xcent
y <- y + ycent - ymin - y2
x1 <- cos(theta) * (x - xcent) - sin(theta) * (y - ycent) + xcent
y1 <- cos(theta) * (y - ycent) + sin(theta) * (x - xcent) + ycent
##For grid library:
if(grid){
grid.lines(unit(x1,"npc"), unit(y1,"npc"),gp=gpar(col=col,lwd=lwd))
}
##Uncomment for base graphics
else{
par(xpd=TRUE)
points(x1,y1,type='l',col=col,lwd=lwd)
par(xpd=FALSE)
}
}
library(ggplot2)
x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)
qplot(x=x,y=y) +
scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") )
curly(N=100,Tilt=0.4,Long=0.3,scale=0.025,xcent=0.2525,
ycent=par()$usr[3]+0.1,theta=-pi/2,col="red",lwd=2,grid=TRUE)
curly(N=100,Tilt=0.4,Long=0.3,scale=0.025,xcent=0.8,
ycent=par()$usr[3]+0.1,theta=-pi/2,col="red",lwd=2,grid=TRUE)
答案 1 :(得分:10)
这是ggplot
中的kludgy解决方案,它构造了一个模糊地类似于大括号的线条图。
构造一个函数,将花括号的位置和尺寸作为输入。此函数的作用是指定括号轮廓图的坐标,并使用一些数学缩放来使其达到所需的大小和位置。您可以使用此原则并修改坐标以获得任何所需的形状。原则上,您可以使用相同的概念并添加曲线,椭圆等。
bracket <- function(x, width, y, height){
data.frame(
x=(c(0,1,4,5,6,9,10)/10-0.5)*(width) + x,
y=c(0,1,1,2,1,1,0)/2*(height) + y
)
}
将其传递给ggplot
,特别是geom_line
qplot(x=x,y=y) +
scale_x_continuous("",breaks=c(.5,2.5), labels=c("Low types","High types")) +
geom_line(data=bracket(0.5,1,0,-0.2)) +
geom_line(data=bracket(2.5,2,0,-0.2))
答案 2 :(得分:9)
更新:如果您需要使用ggsave()保存图表并确保在保存的图像中保留括号,请务必查看this related Stackoverflow Q&A。
OP要求支架离开情节。此解决方案将axis.ticks.length
与axis.ticks = element_blank()
结合使用,以使大括号位于绘图区域之外。
这个答案建立在@Pankil和@ user697473的基础之上:我们将使用pBrackets
R包 - 并包含图片!
library(ggplot2)
library(grid)
library(pBrackets)
x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)
the_plot <- qplot(x=x,y=y) +
scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") ) +
theme(axis.ticks = element_blank(),
axis.ticks.length = unit(.85, "cm"))
#Run grid.locator a few times to get coordinates for the outer
#most points of the bracket, making sure the
#bottom_y coordinate is just at the bottom of the gray area.
# to exit grid.locator hit esc; after setting coordinates
# in grid.bracket comment out grid.locator() line
the_plot
grid.locator(unit="native")
bottom_y <- 284
grid.brackets(220, bottom_y, 80, bottom_y, lwd=2, col="red")
grid.brackets(600, bottom_y, 440, bottom_y, lwd=2, col="red")
关于@ Pankil回答的快速说明:
## Bracket coordinates depend on the size of the plot
## for instance,
## Pankil's suggested bracket coordinates do not work
## with the following sizing:
the_plot
grid.brackets(240, 440, 50, 440, lwd=2, col="red")
grid.brackets(570, 440, 381, 440, lwd=2, col="red")
## 440 seems to be off the graph...
还有一些展示pBrackets
的功能:
#note, if you reverse the x1 and x2, the bracket flips:
the_plot
grid.brackets( 80, bottom_y, 220, bottom_y, lwd=2, col="red")
grid.brackets(440, bottom_y, 600, bottom_y, lwd=2, col="red")
## go vertical:
the_plot
grid.brackets(235, 200, 235, 300, lwd=2, col="red")
grid.brackets(445, 125, 445, 25, lwd=2, col="red")
答案 3 :(得分:7)
as @ user697473建议pBrackets
是优雅的解决方案。
最适合使用默认绘图命令,但要使其与GGplot2一起使用,请使用pBracket::grid.brackets
。我要包含代码,以便轻松试用。
从您的代码
开始library(ggplot2)
x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)
qplot(x=x,y=y) +
scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") ) +
theme(axis.ticks = element_blank())
最后一行删除了你不想要的刻度。
现在是pBrackets
library(pBrackets) # this will also load grid package
grid.locator(unit="native")
现在使用光标识别图表中括号开始和结束的点。您将获得“原生”单元中的相应坐标。现在在下面的命令中提供它们
grid.brackets(240, 440, 50, 440, lwd=2, col="red")
grid.brackets(570, 440, 381, 440, lwd=2, col="red")
您可以在图表的任意位置添加括号,甚至可以使用grid.text
添加文字。
希望这有帮助!谢谢pBrackets
!
Pankil!
答案 4 :(得分:3)
新的pbrackets
包可能有所帮助:http://cran.r-project.org/web/packages/pBrackets/index.html。
答案 5 :(得分:1)
#== 编辑:ggbrace 替换了 curlyBraces 包
这个答案真的很晚,但是对于绘图区域内的大括号,我制作了一个小包 ggbrace,它可以让您使用带有指定坐标的花括号(易于使用):
基本上:
devtools::install_github("NicolasH2/ggbrace")
library(ggbrace)
library(ggplot2)
您可以自定义 x 和 y 坐标以及括号指向的位置。在这种特定情况下:
x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)
qplot(x=x,y=y) +
scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") ) +
geom_brace(aes(x=c(0,1), y=c(0,-.3)), inherit.data=F, rotate=180) +
geom_brace(aes(x=c(2,3), y=c(0,-.3)), inherit.data=F, rotate=180)
编辑:如果您希望大括号位于绘图区域之外,您可以设置一些 ggplot 参数。它在 ggbrace github 页面上有更详细的描述。
qplot(x=x,y=y) +
geom_brace(aes(x=c(0,1), y=c(-.4,-.7), label = "Low types"), inherit.data=F, rotate=180, labelsize=5) +
geom_brace(aes(x=c(2,3), y=c(-.4,-.7), label = "High types"), inherit.data=F, rotate=180, labelsize=5) +
coord_cartesian(y=range(y), clip = "off") +
theme(plot.margin = unit(c(0.05, 0.05, 0.2, 0.05), units="npc"))