首先,为这个例子道歉,但我找不到更好的数据集来证明这个问题。希望,这就足够了。假设我正在尝试从mtcars绘制 mpg 与位移的数据集中制作一个传动方面的网格(自动与手动)和齿轮数,如下所示:
# Load library
library(ggplot2)
# Load data
data(mtcars)
# Plot data
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth()
print(p)
Run Code Online (Sandbox Code Playgroud)
这使,
注意,我添加了一条趋势线geom_smooth,它默认使用黄土曲线。我可以拟合用户定义的函数而不是nls用于该方法的黄土曲线 ,然后陈述一个公式,这很棒。但是是否可以为每个方面拟合不同的用户指定曲线?例如,左上角的线性回归和右下角的衰减指数。这可能吗?还是我用锤子打螺丝?
编辑:此处给出了自定义(即用户定义)拟合函数的解决方案。
例如,
library(ggplot2)
ggplot(mpg, aes(displ, cty)) + geom_point() + facet_grid(cols = vars(drv))
Run Code Online (Sandbox Code Playgroud)
如何更改条带和主图之间的距离?(例如,在条带和主图之间创建一个间隙。)
但我不需要更改条带大小(与此编辑条带大小 ggplot2 不同)。
我想使用ggplot2's创建一个图形facet_grid,如下所示:
# Load ggplot2 library for plotting
library(ggplot2)
# Plot dummy data
p <- ggplot(mtcars, aes(mpg, wt))
p <- p + geom_point()
p <- p + facet_grid(gear ~ cyl)
print(p)
Run Code Online (Sandbox Code Playgroud)

这很好,但由于它出现在期刊文章中,因此每个面板也需要标有 a、b、c 等。该包egg有一个很好的函数调用tag_facet,其用法如下:
# Load egg library for tagging
library(egg)
#> Warning: package 'egg' was built under R version 3.5.3
#> Loading required package: gridExtra
# Same plot but with tags for each facet
p <- ggplot(mtcars, aes(mpg, wt))
p <- p …Run Code Online (Sandbox Code Playgroud) 当我在我的一个维度上有多个变量时,我试图获得一个很好的显示,这样我facet_grid就不会重复每个列(或行)的所有变量的名称,而是在子框上有一个合并的框.使用R中的默认数据集(基于R Cookbook)的具体示例:
library(reshape2)
sp <- ggplot(tips, aes(x=total_bill, y=tip/total_bill)) +
geom_point(shape=1) +
facet_grid(smoker ~ sex+day)
sp
Run Code Online (Sandbox Code Playgroud)
这将返回类似于此图的顶部部分,其中Female/Male在每列的顶部重复.是否有一种方法(在R中)合并所有性别块以获得类似我上传的图的底部部分?(我和Gimp做了这个,不用说它不是一个理想的选择)

我查阅了文档,facet_grid感觉解决方案就是创建一个新的贴标机功能,但我对R来说太新了,无法继续使用它.我已经搜索了一下,看看是否有人已经解决了这个问题,但似乎没有找到任何答案.
有没有人知道已经为此目的创建的自定义贴标机功能,或者是否有人知道如何创建这样的自定义贴标机功能?那真是太神奇了.
我的数据在包中ggplot2通过具有多个(~10)个面的条形图进行可视化。我想首先将这些方面分成几行。我可以使用函数facet_grid()或facet_wrap()来实现此目的。在此处的最小示例数据中,我在两行 (4x2) 中构建了 8 个面。但是,我需要调整不同方面的比例,即:第一行包含小比例的数据,第二行的值更大。因此,我需要对第一行中的所有数据使用相同的比例,以便沿行比较它们,并为第二行使用另一个比例。
这是最小的示例和可能的解决方案。
#loading necessary libraries and example data
library(dplyr)
library(tidyr)
library(ggplot2)
trial.facets<-read.csv(text="period,xx,yy
A,2,3
B,1.5,2.5
C,3.2,0.5
D,2.5,1.5
E,11,13
F,16,14
G,8,5
H,5,4")
#arranging data to long format with omission of the "period" variable
trial.facets.tidied<-trial.facets %>% gather(key=newvar,value=newvalue,-period)
Run Code Online (Sandbox Code Playgroud)
现在正在策划自己:
#First variant
ggplot(trial.facets.tidied,aes(x=newvar,y=newvalue,position="dodge"))+geom_bar(stat ="identity") +facet_grid(.~period)
#Second variant:
ggplot(trial.facets.tidied,aes(x=newvar,y=newvalue,position="dodge"))+geom_bar(stat ="identity") +facet_wrap(~period,nrow=2,scales="free")
Run Code Online (Sandbox Code Playgroud)
第一个和第二个变体的结果如下:
在这两个示例中,我们要么对所有图形使用自由比例,要么对所有图形使用固定比例。同时,第一行(前 4 个面)需要稍微缩放到 5,第二行需要缩放到 15。
作为使用facet_grid()函数的解决方案,我可以添加一个假变量“row”,它指定相应的字母应该属于哪一行。新数据集 Trial.facets.row(仅显示三行)如下所示:
period,xx,yy,row
C,3.2,0.5,1
D,2.5,1.5,1
E,11,13,2
Run Code Online (Sandbox Code Playgroud)
然后我可以将相同的重新排列为长格式,省略变量“句点”和“行”:
trial.facets.tidied.2<-trial.facets.row %>% gather(key=newvar,value=newvalue,-period,-row)
Run Code Online (Sandbox Code Playgroud)
然后,我沿着变量“行”和“周期”排列面,希望使用该选项scales="free_y"仅跨行调整比例:
ggplot(trial.facets.tidied.2,aes(x=newvar,y=newvalue,position="dodge"))+geom_bar(stat ="identity") +facet_grid(row~period,scales="free_y")
Run Code Online (Sandbox Code Playgroud)
并且 …
StudentData <- data.frame(gender = sample( c("male","female"), 100, replace=TRUE),
degree = sample( c("Associates", "Masters", "PhD"), 100, replace=TRUE),
category = sample( c("Audit", "Credit"), 100, replace=TRUE))
Run Code Online (Sandbox Code Playgroud)
在下面的数据集中,我尝试创建一个条形图,绘制具有副学士学位、硕士学位或博士学位的样本的百分比,按性别分隔(通过使用 facet_grid() 完成)。这是我到目前为止生成的:
StudentData %>% ggplot(., aes(x=degree, group=gender)) +
geom_bar(aes(y=..prop..), stat="count", position=position_dodge()) +
geom_text(aes(label=scales::percent(round(..prop..,2)),
y=..prop..), stat="count", vjust=-.5) +
scale_y_continuous(limits=c(0,1),labels = scales::percent) +
ylab("Percent of Sample") +
facet_grid(~gender)
Run Code Online (Sandbox Code Playgroud)
但是,我还想将每个图表上的“审计”和“信用”组之间的差异显示为并排条形。然而,当我将“fill=category”添加到 ggplot 的美学中时,没有任何变化:
StudentData %>% ggplot(., aes(x=degree, group=gender, fill=category)) +
geom_bar(aes(y=..prop..), stat="count", position=position_dodge()) +
geom_text(aes(label=scales::percent(round(..prop..,2)),
y=..prop..), stat="count", vjust=-.5) +
scale_y_continuous(limits=c(0,1),labels = scales::percent) +
ylab("Percent of Sample") +
facet_grid(~gender)
Run Code Online (Sandbox Code Playgroud)
我意识到这通常是使用完成的geom_bar(stat="identity", …
我正在尝试编写一个函数来在网格中绘制图形。我正在使用 ggplot 和构面网格。我无法传递有关方面网格的论点。我想知道是否有人能指出我正确的方向。
数据示例:
Year = as.factor(rep(c("01", "02"), each = 4, times = 1))
Group = as.factor(rep(c("G1", "G2"), each = 2, times = 2))
Gender = as.factor(rep(c("Male", "Female"), times = 4))
Percentage = as.integer(c("80","20","50","50","45","55","15","85"))
df1 = data.frame (Year, Group, Gender, Percentage)
Run Code Online (Sandbox Code Playgroud)
不带函数的网格图的代码是:
p = ggplot(data=df1, aes(x=Year, y=Percentage, fill = Gender)) + geom_bar(stat = "identity")
p = p + facet_grid(~ Group, scales = 'free')
p
Run Code Online (Sandbox Code Playgroud)
这会产生像我想做的那样的情节。但是,当我将其放入函数中时:
MyGridPlot <- function (df, x_axis, y_axis, bar_fill, fgrid){
p = ggplot(data=df1, aes(x=x_axis, y=y_axis, fill = …Run Code Online (Sandbox Code Playgroud) facet_grid例如,我试图用来布置面板,
library(tidyverse)
library(lubridate)
economics %>%
filter(date >= ymd(19680101)) %>%
mutate(
year = year(date),
month = month(date),
decade = floor(year/10) * 10,
single = year - decade,
decade = paste0(decade, "s")
) %>%
ggplot(aes(month, uempmed)) +
geom_point() +
facet_grid(decade ~ single)
Run Code Online (Sandbox Code Playgroud)
我的问题是,我怎样才能乘坐前 7 个面板(和最后 4 个),让它们完全空白?
有没有办法来改变首先从属性标签1:3喜欢的东西c(good, bad, ugly)。另外,我想R2为每个方面增加价值。下面是我的代码 - 我尝试了一些东西但没有成功。
DF = data.frame(SUB = rep(1:3, each = 100), Ob = runif(300, 50,100), S1 = runif(300, 75,95), S2 = runif(300, 40,90),
S3 = runif(300, 35,80),S4 = runif(300, 55,100))
FakeData = gather(DF, key = "Variable", value = "Value", -c(SUB,Ob))
ggplot(FakeData, aes(x = Ob, y = Value))+
geom_point()+ geom_smooth(method="lm") + facet_grid(Variable ~ SUB, scales = "free_y")+
theme_bw()
Run Code Online (Sandbox Code Playgroud)
这是我使用上述代码得到的图。
我尝试了下面的代码来更改 facet_label 但它没有用
ggplot(FakeData, SUB = factor(SUB, levels = c("Good", "Bad","Ugly")), aes(x = Ob, …Run Code Online (Sandbox Code Playgroud) 使用facet_grid(),在绘制垂直堆叠在单列中的图时,如何将组名称(即灰色条带)放置在图的顶部?
根据我的尝试,当使用 垂直堆叠图时facet_grid(),您不能将条带放在图表的顶部或底部;您只能使用参数将条带放置在图的右侧或左侧switch = c("y", "x", "both")。
我知道facet_wrap()(并且facet_col()来自 ggforce)可以使用参数将条带放置在任何位置strip.position = c("top", "bottom", "left", "right"),无论图形如何绘制:垂直或水平。我曾经facet_wrap()生成过下面的图 1(代码位于可复制代码部分)。
但是,我希望能够facet_grid()不使用facet_wrap来生成下面的图(条带位于“顶部”)。
图 1:我希望能够使用facet_grid()
理想情况下,如果可以扩展 switch 参数或者strip.position可以将参数添加到facet_grid(),以便能够将条带放在顶部,那就太好了。我尝试自己尝试更改源代码和facet_grid()函数facet_wrap(),但无法弄清楚。
我不简单地使用facet_wrap()函数的原因是因为不幸的是它没有我的应用程序中space="free"可用facet_grid()且必不可少的参数。
下面是一个可重现的示例,稍作修改后,布兰登·贝特尔森 (Brandon Bertelsen) 的答案的代码就在这里:
可重现的代码:
数据:
dat <- data.frame(value=runif(30)*10,
grouping=c(rep("Group 1",10),
rep("Group 2",10),
rep("Group 3",10)),
letters=rep(LETTERS[1:10], 3)
Run Code Online (Sandbox Code Playgroud)
用于facet_wrap在垂直绘制图形时将条带置于顶部:
ggplot(dat, aes(letters,value, label = letters)) …Run Code Online (Sandbox Code Playgroud) facet-grid ×10
ggplot2 ×10
r ×10
facet ×3
facet-wrap ×3
function ×1
geom-bar ×1
scatter-plot ×1