我想限制绘图的可见y范围。为了保留超出此范围的值,我需要设置oob(超出范围),rescale_none并且效果很好。
但是,我还要在情节外的空白处添加一些文本。为此,我需要关闭剪辑。这样的结果是,超出界限的值在边距的绘图区域之外绘制。
无论如何,是否在页边距中绘制文本并裁剪值以绘制区域?
# Data
set.seed(1)
df <- data.frame( x=1:100,y=rnorm(100,mean=1,sd=1) )
# Basic plot
library(ggplot2)
library(scales)
library(grid)
g <- ggplot(df)+
geom_line(aes(x,y))
# Values exceeding scale limits are dropped
g1 <- g + scale_y_continuous( limits = c(0,2) )
Run Code Online (Sandbox Code Playgroud)

# This is what I want
g2 <- g + scale_y_continuous( limits = c(0,2) , oob = rescale_none )
Run Code Online (Sandbox Code Playgroud)

# ...But, I would like to plot some text outside the plotting region
# and need …Run Code Online (Sandbox Code Playgroud) 在RI中,要通过添加图例正下方(在图的右侧,而图例保持在右侧)的文本,来创建一个接收ggplot对象和一些文本并返回并返回ggplot对象的函数。
myplot = ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Species)) +
geom_line()
Run Code Online (Sandbox Code Playgroud)
我想在图例之后添加文本“ Sepal.Width的平均值= 3.05”(及其周围的方框)。我看了相关的问题,但它们将图例的位置更改为底部,因此无法作为函数工作,而是打印出图。
我想对绘图进行注释,并且希望注释位于绘图区域之外。我找到了这个解决方案,它适用于在绘图区域之外添加注释,但我无法弄清楚如何更改标签的外观(最重要的是,就我的目的而言,字体大小)。
这是上述解决方案的一个最小示例:
library (ggplot2)
library(grid)
df=data.frame(y=c("dog1","dog2","dog3"),x=c(12,10,14),n=c(5,15,20))
p <- ggplot(df, aes(x,y)) + geom_point()
# Add the annotation
p <- p + geom_text(aes(label = "Hello World!", x = 0, y = 0), vjust = 2, hjust = 1)
# Code to override clipping
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)
Run Code Online (Sandbox Code Playgroud)
理想情况下,注释应位于左下角。
我正在尝试拟合在背景图像上显示的图.由于锐度的损失,我无法过度拉伸图像.因此,我必须在背景图像上拟合图,这比图更薄.我不知道怎么做.请参阅附图:
以下是示例R代码:
library(ggplot2)
library(readxl)
library(jpeg)
library(grid)
# find the ".jpg" image files and parse them to get the depth ranges for each image
setwd('~/R/Image_Example')
image_file <- "C1_9195-9197.jpg"
# read in the image file
img <- readJPEG(image_file)
g <- rasterGrob(img, interpolate = FALSE)
# read in the CT data
df_ct <- read_excel("CT_Doris25_short.xlsx", col_names = FALSE)
g_ct <- ggplot(data=df_ct) +
annotation_custom(g, xmin=min(df_ct$X1), xmax=max(df_ct$X1), ymin=-Inf, ymax=Inf) +
geom_path(aes_string(x=df_ct$X1, y=df_ct$X0), color='cyan') +
scale_y_reverse() +
theme(plot.margin = unit(c(0,0,0,0), "lines"))
g_ct
Run Code Online (Sandbox Code Playgroud)
如你看到的,
我试图在annotation_custom中调整xmin和xmax.是否有一种方法可以使"青色"颜色显示的图形完全适合背景图像的"宽度"?我不介意图表是否更薄并且未显示X轴.事实上,当我使用gridExtra包装组合其他一些图表时,我就是这么做的.
我想在所示图像的顶部显示起始深度9195,并在图像底部显示结束深度9197.然后我不需要Y轴.我知道如何抑制X轴和Y轴标签的显示.所以这不是问题.我打开它们进行澄清.可以通过编程方式完成吗?
如您所见,沿Y轴的刻度以0.5为步长变化,即9195,9195.5,9196 ......等等.我想让它们以0.1而不是0.5的步长上升(或下降).另外,我不想显示Y轴标签,只是勾选.图像顶部(9195)和底部(9197)的深度就足够了. …
假设我遇到以下问题:拥有一组数据,生成一个图表,指示有多少数据点低于任何给定阈值。
这是相当容易实现的
n.data <- 215
set.seed(0)
dt <- rnorm(n.data) ** 2
x <- seq(0, 5, by=.2)
y <- sapply(x, function(i) length(which(dt < i)))
ggplot() +
geom_point(aes(x=x,y=y)) +
geom_hline(yintercept = n.data)
Run Code Online (Sandbox Code Playgroud)
问题是,假设我想添加一个标签来指示观察总数是 ( n.data)。我该如何做到这一点,同时将其他休息时间保持为默认?
我想要的结果如下图所示,由代码生成
ggplot() +
geom_point(aes(x=x,y=y)) +
geom_hline(yintercept = n.data) +
scale_y_continuous(breaks = c(seq(0,200,50),n.data))
Run Code Online (Sandbox Code Playgroud)
但是,即使我更改 的值n.data,我也希望它能够工作,只需将其添加到默认中断即可。(如果您还消除了最后一个默认中断与默认中断之间的网格线,则会获得奖励积分n.data!)
如果没有大量工作,我想要的可能是不可能的,但也许有人有解决方案。我有一个如下图(当然这是一个过于简单的示例),其中我的刻度标签彼此非常接近:
dd <- data.frame(x=1:4, y=c(-10,10.5,10.6,10.7),
z = LETTERS[1:4])
library(ggplot2)
gg1 <- ggplot(dd, aes(x,y)) +
geom_point() +
geom_segment(x=0, aes(xend=x, y=y, yend=y)) +
scale_y_continuous(breaks=dd$y, labels=dd$z)
Run Code Online (Sandbox Code Playgroud)
如果我真的想要,我可以导出为 SVG,将其转储到 Inkscape 中,然后手动将标签分开(甚至添加连接标签与精确 y 轴位置的小指示线):
如果能够以编程方式/自动执行类似的操作,那就太好了。我想:
ggrepel包(仅适用于图中的标签/文本 AFAIK)directlabels包(它有一些放置选项,例如“first.bumpup”,可能适合这种情况/可修改)n.dodge参数check.overlap看起来有用且有趣,它们几乎可以处理这种情况,但会水平避开标签,如果标签长于几个字符,这会变得难看......guide_axisn.dodge我很高兴有一个label.pos.nudge参数可以手动指定,以将标签沿轴的位置从相应的位置移开
**编辑,这里有两个很好的解决方案,一个被标记为答案,但@hrbrmstr提供了一个很好的解决方案,结合了两个ggplots,适用于这个简单的情节.*
这是代码
breaks.major <- c(0,15,37.5,52.5,67.5,82.5,95,100) #defines the midpoints of the categories (label locations)
breaks.minor <- c(30,45,60,75,90) #defines the edges of the categories (second label set I need)
labels.minor <- c("","Extremely \nDissatisfied","Dissatisfied","Uncertain","Satisfied","Very \nSatisfied","Extremely \nSatisfied","")
lims =c(0,100)
g <- ggplot(mpg, aes(class))+
geom_bar()+
coord_flip()+
scale_y_continuous(limit = lims, minor_breaks = breaks.minor, breaks = breaks.major, labels = labels.minor) +
theme(panel.grid.major.x = element_blank()) +
theme(panel.grid.major.y = element_blank()) +
theme(axis.ticks.x=element_blank()) +
theme(axis.title= element_blank())
Run Code Online (Sandbox Code Playgroud)
它产生了这个情节:
我需要有两组X轴标签,一组显示类别名称(即已经存在的"满意"等labels.minor),一组显示breaks.minor位置的值(对应于类别限制,即垂直面板网格线).我需要当前labels.minor标签低于所需的附加标签.
我目前使用换行符进行此操作,以便数字和类别都在一个长字符串中,但是间距会变得有趣,因为情节调整大小.我可以使用文本框(我假设)这样做,ggplot中有没有办法?
如果您将当前标签放在其中心部分(例如"非常满意"偏离中心),则需要额外积分
这是我想要的输出(原谅我的'mspaint')
是否可以在ggplot2中用自定义文本替换图例?我知道注释,但我不想写入图表,而是在它旁边(或在它下面) - 确切地说是一个传说,并以一种相当简单的方式进行.
例如在这个简单的图表中
library(data.table)
library(ggplot2)
library(ggrepel)
id <- c(1:10)
x1 <- sample(1:10, 10, replace=T)
x2 <- sample(1:10, 10, replace=T)
x3 <- sprintf("Point.%d",id)
df<-data.frame(id,x1,x2,x3)
dt<-data.table(df)
setkeyv(dt,c("id"))
p<-ggplot(data=dt,aes(x1,x2))+geom_point()+geom_text_repel(aes(label=x3))+
ggtitle("Graph")+xlab("X")+ylab("Y")+theme_bw()
p
Run Code Online (Sandbox Code Playgroud)
我想写一些关于旁边图表的(简短的).我担心这在ggplot2中可能不容易实现,因为它超出了它的目的 - 但对我帮助很大.