I'm not sure if I've encountered a bug or am doing incorrectly. When specifying axis.text
margins in ggplot, and moving the position of the axis, the settings to not persist.
Without moving the axis text, there is plenty of space around the axis:
library(ggplot)
ggplot(mtcars, aes(mpg, wt)) +
geom_point() +
theme(axis.text.y = element_text(color = "red", margin = margin(40, 40, 40, 40)))
But, when the position is changed, the margins do not apply:
ggplot(mtcars, aes(mpg, wt)) +
geom_point() +
scale_y_continuous(position = "right") + #This is the new line
theme(axis.text.y = element_text(color = "red", margin = margin(40, 40, 40, 40)))
I'd expect the margins to carry over regardless of whether the axis.text is on the right or left. Am I doing something wrong?
I believe this arises because the appearance of the right side y-axis label is dictated by axis.text.y.right
in theme()
, and while it inherits from axis.text.y
, it only inherits arguments that are not stated in axis.text.y.right
itself.
According to details in ?theme
, the chain of inheritance for axis.text.y.right
goes as follows:
axis.text.y.right
-> axis.text.y
-> axis.text
-> text
The default theme in ggplot is theme_grey
. Enter theme_grey
(without ()
at the end) into your console, and you'll see the full function. Let's look at the relevant bits:
function(base_size = 11, base_family = "", base_line_size = base_size/22,
base_rect_size = base_size/22) {
half_line <- base_size/2
theme(text = element_text(family = base_family,
face = "plain",
colour = "black",
size = base_size,
lineheight = 0.9,
hjust = 0.5,
vjust = 0.5,
angle = 0,
margin = margin(),
debug = FALSE),
axis.text = element_text(size = rel(0.8),
colour = "grey30"),
axis.text.y = element_text(margin = margin(r = 0.8 * half_line/2),
hjust = 1),
axis.text.y.right = element_text(margin = margin(l = 0.8 * half_line/2),
hjust = 0),
...
complete = TRUE)
}
?element_text
shows the full list of arguments that element_text
expects:
element_text(family = NULL, face = NULL, colour = NULL, size = NULL,
hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL,
color = NULL, margin = NULL, debug = NULL, inherit.blank = FALSE)
Given all the inheritance, what are axis.text.y.right
's actual arguments in theme_grey
?
base_family
(from text
)"plain"
(from text
)"grey30"
(from axis.text
, which overrides text
's "black"
)base_size
(from axis.text
's rel(0.8)
modification of text
's base_size
)0
(from axis.text.y.right
, which overrides axis.text.y
's 1
, which overrides text
's 0.5
)0.5
(from text
)0
(from text
)0.9
(from text
)margin(l = 0.8 * half_line/2)
(from axis.text.y.right
, which overrides axis.text.y
's margin = margin(r = 0.8 * half_line/2
, which overrides text
's margin()
)FALSE
(from text
)FALSE
(element_text
's default parameter)As such, given a piece of code like below, axis.text.y.right
will inherit color = "red"
(which overrides axis.text
's colour = "grey30"
). But since it has its own margin argument, it will not inherit margin = margin(40, 40, 40, 40)
:
ggplot(mtcars, aes(mpg, wt)) +
geom_point() +
scale_y_continuous(position = "right") +
theme(axis.text.y = element_text(color = "red", margin = margin(40, 40, 40, 40)))
Specifying axis.text.y.right
instead of axis.text.y
would do the trick:
ggplot(mtcars, aes(mpg, wt)) +
geom_point() +
scale_y_continuous(position = "right") +
theme(axis.text.y.right = element_text(color = "red", margin = margin(40, 40, 40, 40)))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With