我想通过使用ggplot2重现下面的情节。我可以靠近,但不能删除顶部和右边界。下面我介绍几次使用ggplot2的尝试,包括在Stackoverflow上或通过Stackoverflow找到的一些建议。不幸的是,我无法将这些建议付诸实践。
我希望有人能够纠正下面的一个或多个代码段。
感谢您提出任何建议。
# desired plot
a <- seq(1,20)
b <- a^0.25
plot(a,b, bty = "l")
library(ggplot2)
df <- as.data.frame(cbind(a,b))
# 1. ggplot2 default
ggplot(df, aes(x = a, y = b)) + geom_point()
# 2. removes background color
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black'))
# 3. also removes gridlines
none <- theme_blank()
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none)
# 4. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = none)
# 5. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(axis.line = theme_segment())
# 6. removes x and y axis in addition to top and right border
# http://stackoverflow.com/questions/5458409/remove-top-and-right-border-from-ggplot2
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.background=theme_rect(colour=NA))
# 7. returns error when attempting to remove top and right border
# https://groups.google.com/group/ggplot2/browse_thread/thread/f998d113638bf251
#
# Error in el(...) : could not find function "polylineGrob"
#
theme_L_border <- function(colour = "black", size = 1, linetype = 1) {
structure(
function(x = 0, y = 0, width = 1, height = 1, ...) {
polylineGrob(
x=c(x+width, x, x), y=c(y,y,y+height), ..., default.units = "npc",
gp=gpar(lwd=size, col=colour, lty=linetype),
)
},
class = "theme",
type = "box",
call = match.call()
)
}
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts( panel.border = theme_L_border())
答案 0 :(得分:114)
编辑忽略此答案。现在有更好的答案。查看评论。使用+ theme_classic()
修改强>
这是一个更好的版本。原始帖子中提到的错误仍然存在(我认为)。但轴线在面板下绘制。因此,请同时删除panel.border
和panel.background
以查看轴线。
library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
ggplot(df, aes(x = a, y = b)) + geom_point() +
theme_bw() +
theme(axis.line = element_line(colour = "black"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank())
原帖
这很接近。有一个axis.line
无法在y轴(see here)上工作的错误,似乎尚未修复。因此,在移除面板边框后,必须使用geom_vline
单独绘制y轴。
library(ggplot2)
library(grid)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
p = ggplot(df, aes(x = a, y = b)) + geom_point() +
scale_y_continuous(expand = c(0,0)) +
scale_x_continuous(expand = c(0,0)) +
theme_bw() +
opts(axis.line = theme_segment(colour = "black"),
panel.grid.major = theme_blank(),
panel.grid.minor = theme_blank(),
panel.border = theme_blank()) +
geom_vline(xintercept = 0)
p
剪切了极值点,但可以使用baptiste之前的代码撤消裁剪。
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)
或使用limits
移动面板的边界。
ggplot(df, aes(x = a, y = b)) + geom_point() +
xlim(0,22) + ylim(.95, 2.1) +
scale_x_continuous(expand = c(0,0), limits = c(0,22)) +
scale_y_continuous(expand = c(0,0), limits = c(.95, 2.2)) +
theme_bw() +
opts(axis.line = theme_segment(colour = "black"),
panel.grid.major = theme_blank(),
panel.grid.minor = theme_blank(),
panel.border = theme_blank()) +
geom_vline(xintercept = 0)
答案 1 :(得分:73)
ggplot(0.9.2+)的最新更新已经彻底改变了主题的语法。最值得注意的是,opts()
现已弃用,已被theme()
取代。 Sandy's答案仍将(截至12月1日)生成一个图表,但会导致R抛出一堆警告。
这是反映当前ggplot语法的更新代码:
library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
#base ggplot object
p <- ggplot(df, aes(x = a, y = b))
p +
#plots the points
geom_point() +
#theme with white background
theme_bw() +
#eliminates background, gridlines, and chart border
theme(
plot.background = element_blank()
,panel.grid.major = element_blank()
,panel.grid.minor = element_blank()
,panel.border = element_blank()
) +
#draws x and y axis line
theme(axis.line = element_line(color = 'black'))
产生
答案 2 :(得分:21)
theme_classic()
的替代方法是cowplot包theme_cowplot()
附带的主题(随包自动加载)。它看起来类似于theme_classic()
,但有一些细微差别。最重要的是,默认标签尺寸较大,因此生成的图形可以在出版物中使用而无需进一步修改(特别是如果您使用save_plot()
而不是ggsave()
保存它们)。此外,背景是透明的,而不是白色,如果您想在插图画家中编辑图形,这可能很有用。最后,在我看来,刻面图看起来更好。
示例:
library(cowplot)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))
p <- ggplot(df, aes(x = a, y = b)) + geom_point()
save_plot('plot.png', p) # alternative to ggsave, with default settings that work well with the theme
这是此代码生成的文件plot.png
的样子:
免责声明:我是包裹作者。
答案 3 :(得分:8)
我跟着Andrew's answer,但由于我的ggplot版本(v2.1.0)中存在错误,我还必须按照https://stackoverflow.com/a/35833548分别设置x和y轴。
而不是
theme(axis.line = element_line(color = 'black'))
我用过
theme(axis.line.x = element_line(color="black", size = 2),
axis.line.y = element_line(color="black", size = 2))
答案 4 :(得分:1)
从上面的简化中可以看出,安德鲁的答案导致产生半边框的关键主题。
theme (panel.border = element_blank(),
axis.line = element_line(color='black'))
答案 5 :(得分:1)
以上选项不适用于使用speed date
54.72 1:33:56
49.37 1:33:59
37.03 1:34:03
24.02 7:39:58
28.02 7:40:01
24.04 7:40:04
24.02 7:40:07
25.35 7:40:10
26.69 7:40:13
32.04 7:40:16
28.02 11:05:43
30.71 11:05:46
29.36 11:05:49
18.68 11:05:52
54.72 11:05:55
34.69 10:31:34
25.03 10:31:38
56.04 10:31:40
44.03 10:31:43
和sf
创建的地图。因此,我想在此处添加相关的geom_sf()
参数。这将创建一个漂亮的干净地图,仅显示功能。
ndiscr
答案 6 :(得分:0)
这是一个非常简单的答案
yourPlot +
theme(
panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black")
)
就这么简单。来源:this文章的结尾