Reputation: 9592
I want to put labels inside the plot area.
Here's an example plot:
library(ggplot2)
set.seed(123)
random_word <- function() paste(sample(letters, 10, replace = T), collapse='')
dat <- data.frame(x = replicate(4, random_word()),
y = runif(5*4, 0, 100))
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
coord_flip() +
theme_minimal()
I know I can use geom_text
to hack my way to the result I want:
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_text(data = dat[1:4,],
aes(label=x),
y = 1,
hjust=0, vjust=-1 ) +
coord_flip() +
theme_minimal() +
theme(axis.text.y = element_blank())
Comments on this question [ move axis labels ggplot ] suggest that margin
is the non hacky way to do this in current ggplot, but it doesn't seem to move the axis text inside the plot area.
# doesn't do the trick
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
coord_flip() +
theme_minimal() +
theme(axis.title.y = element_text(margin = margin(l = 50)))
Is there some elegant way to get this sort of output by setting theme()
parameters?
my sessionInfo()
is:
> sessionInfo()
R version 3.5.2 (2018-12-20)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.3
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggthemes_4.1.0 forcats_0.4.0 stringr_1.4.0 dplyr_0.8.0.1 purrr_0.3.1 readr_1.3.1
[7] tidyr_0.8.3 tibble_2.0.1 ggplot2_3.1.0 tidyverse_1.2.1
Upvotes: 5
Views: 5095
Reputation: 357
ggplot( mtcars , aes(x=mpg, y=wt)) +
geom_point() +
theme(
axis.text.x=element_text(vjust=15),
axis.ticks.x=element_line(color='red'),
axis.ticks.length.x.bottom = grid::unit(3, 'mm')
) +
labs(x='', y='')
Upvotes: -1
Reputation: 579
Interesting question. I'm not aware of an elegant way of doing this, but margin()
does move the text into the plot area if you really want it to. In order for it to work, you also need to play around with the right parameter instead of just the left parameter.
I tried playing around with the top and bottom parameters as well, but it seems that margin()
indeed doesn't do anything here. However, you can use vjust
for vertically shifting it away from the grid lines.
Also note that I corrected your error where you shifted the axis title instead of the axis text.
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
coord_flip() +
theme_minimal() +
theme(axis.text.y = element_text(vjust = -0.7,
margin = margin(l = 20, r = -50))) # note the negative value for r
Upvotes: 1