R:ggplot 和 plotly 轴边距不会改变
Posted
技术标签:
【中文标题】R:ggplot 和 plotly 轴边距不会改变【英文标题】:R: ggplot and plotly axis margin won't change 【发布时间】:2017-08-03 10:45:36 【问题描述】:我在阻止 y 轴文本与使用 ggplotly
周围 ggplot
的刻度重叠时遇到问题。我怎样才能解决这个问题?我试过以下代码:
set.seed(395)
df1<- data.frame(CO2= c(cumsum(rnorm(1*36)), cumsum(rnorm(1*36))),
Group= rep(c("A","B"), each=36),
Segment=rep(seq(1,12),each=36))
plot<-ggplot(df1, aes(CO2, fill = Group)) +
geom_density(alpha = 0.8)+
facet_wrap(~ Segment)+
theme_bw()+
labs(x="CO2", y="density")
#Shouldn't the following work?
pb <- plotly_build(plot)
pb$layout$margin$l <- 200
pb$layout$margin$b <- 100
pb
【问题讨论】:
你试过这个吗:***.com/questions/14487188/…? 它似乎没有任何区别。我应该澄清我正在使用 ggplotly 我收到了Error in eval(expr, envir, enclos) : object 'y' not found
的ggplot
电话。
你的例子不起作用;我有没有尝试过类似 pb %>% layout(margin = list(t=150, l = 150, r =150, b=150))
【参考方案1】:
我发现上面的两个答案都非常有用。但是,我注意到上面给出的layout_ggplotly()
函数只有在 x 和 y 轴标题存在时才能正常工作。如果缺少其中任何一个(例如,由于theme(axis.title.x = element_blank())
),则使用...[[1]]...
和...[[2]]...
的位置引用指的是错误的标题/注释。
我在我的项目中编写了一个函数来解决这种限制,我相信这是建立在以前的答案之上的。
annotatify <- function(gg, x.y = -0.05, y.x = -0.05)
wip <- gg[['x']][['layout']][['annotations']] %>%
enframe() %>%
mutate(value = map(value, as_tibble)) %>%
unnest(cols = c(value)) %>%
filter(!is.na(annotationType)) %>%
mutate(
x = case_when(x == 0.5 ~ x, TRUE ~ x.y),
y = case_when(y == 0.5 ~ y, TRUE ~ y.x)
) %>%
select(name, text, x, y) %>%
unique()
if (nrow(wip) == 2)
for (i in 1:nrow(wip))
if (wip$x[i] == 0.50)
gg[['x']][['layout']][['annotations']][[1]][['y']] <- wip$y[i]
else
gg[['x']][['layout']][['annotations']][[2]][['x']] <- wip$x[i]
else if (wip$y == 0.5)
gg[['x']][['layout']][['annotations']][[1]][['x']] <- wip$x
else
gg[['x']][['layout']][['annotations']][[1]][['y']] <- wip$y
gg
【讨论】:
【参考方案2】:从Github 找到一个优雅地解决了这个问题的答案。
layout_ggplotly <- function(gg, x = -0.02, y = -0.08)
# The 1 and 2 goes into the list that contains the options for the x and y axis labels respectively
gg[['x']][['layout']][['annotations']][[1]][['y']] <- x
gg[['x']][['layout']][['annotations']][[2]][['x']] <- y
gg
gp %>% layout_ggplotly
【讨论】:
【参考方案3】:让我们使用来自here 的简单可重现示例。
library(gapminder)
library(plotly)
p <- ggplot(gapminder, aes(x=gdpPercap, y=lifeExp)) + geom_point() + scale_x_log10()
p <- p + aes(color=continent) + facet_wrap(~year)
gp <- ggplotly(p)
我们可以按照 MLavoie 的建议移动调整 margins,但随后我们的轴图例也会移动。
gp %>% layout(margin = list(l = 75))
轴标签其实不是标签而是注解,所以我们先移动一下。可以查询图中注解的结构gp
:
# find the annotation you want to move
str(gp[['x']][['layout']][['annotations']])
List of 15
$ :List of 13
..$ text : chr "gdpPercap"
..$ x : num 0.5
..$ y : num -0.0294
..$ showarrow : logi FALSE
..$ ax : num 0
..$ ay : num 0
..$ font :List of 3
.. ..$ color : chr "rgba(0,0,0,1)"
.. ..$ family: chr ""
.. ..$ size : num 14.6
..$ xref : chr "paper"
..$ yref : chr "paper"
..$ textangle : num 0
..$ xanchor : chr "center"
..$ yanchor : chr "top"
..$ annotationType: chr "axis"
$ :List of 13
..$ text : chr "lifeExp"
..$ x : num -0.0346
..$ y : num 0.5
.... <truncated>
好的,所以注释存储在 15 个列表中; "lifeExp" 是该列表的第二个([[2]]
) 元素。在这种情况下,“x”([['x']]
)和“y”值分别控制左右/上下移动。
# Check current x-location of x-axis label
gp[['x']][['layout']][['annotations']][[2]][['x']]
[1] -0.03459532
# Move the label further to the left
gp[['x']][['layout']][['annotations']][[2]][['x']] <- -0.1
gp %>% layout(margin = list(l = 75))
【讨论】:
谢谢!这是一种享受!您对此代码或文档有任何参考吗?您正在调整的是情节还是 ggplot 功能? @HCAI:很高兴它成功了!边距是一个绘图布局属性(我添加了一个指向原始答案的链接),第二部分是 ggplot 的调整/破解以绘图转换结果。转换通常效果很好,但有时需要一些帮助。 当我尝试这个时,我得到:*tmp*
[[2]] 中的错误:下标越界
@MichaelSzczepaniak:我刚刚再次尝试,代码仍然适用于我。您可以将您的代码和设置作为单独的问题发布吗?
@Max:谢谢回复。我在这里发布了另一个代码问题:***.com/questions/47523919/…以上是关于R:ggplot 和 plotly 轴边距不会改变的主要内容,如果未能解决你的问题,请参考以下文章
如何在ggarrange ggpubr ggplot中调整边距(轴元素消失)R
R语言可视化包ggplot2包改变边距(margin)实战(Modify the Margins)
R语言ggplot2可视化改变线图(line plot)中线条的色彩实战
R语言ggplot2可视化密度图(density plot)改变密度图下的填充色实战
R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(改变点的大小和形状)实战