(I've posted the same question on SO, not sure if there are rules against that or not?)

Example:

```
diamonds %>%
ggplot(aes(scale(price) %>% as.vector)) +
geom_density() +
xlim(-3, 3) +
facet_wrap(vars(cut))
```

Returns a plot:

Since I used scale, those numbers are the zscores or standard deviations away from the mean of each break.

I would like to add as a row underneath the equivalent non scaled raw number that corresponds to each.

e.g. `diamonds$price %>% log %>% mean %>% exp`

(i.e. the exp transformed Geo mean) would go underneath the middle at break 0.

Tried:

```
diamonds %>%
ggplot(aes(scale(price) %>% as.vector)) +
geom_density() +
xlim(-3, 3) +
facet_wrap(vars(cut)) +
geom_text(aes(label = price))
```

Gives:

Error: geom_text requires the following missing aesthetics: y

I then tried changing my call to `geom_text()`

```
geom_text(data = diamonds, aes(price), label = price)
```

This results in the same error message.

My primary question is how can I add the raw values underneath -3:3 of each break? I don't want to change those breaks, I still want 6 breaks between -3:3.

Secondary question, how can I get -3 and 3 to actually show up in the chart? They have been trimmed.

Here is an approach to getting the numbers up top.

```
(diamonds2 <- mutate(diamonds,
scale_price = scale(price) %>% as.numeric()
))
lm1 <- lm(price ~ scale_price, data = diamonds2)
diamonds2 %>%
ggplot(aes(x = scale_price)) +
geom_density() +
coord_fixed(xlim = c(-3, 3)) +
scale_x_continuous(breaks = -3:3,
sec.axis = sec_axis(~ . * lm1$coefficients[[1]] + lm1$coefficients[[2]],
guide = guide_axis(position = "top"),
breaks = (-1:4) * 5000
)) +
facet_wrap(vars(cut), ncol = 2)
```

Thanks for the suggestion, I get an error message when trying this:
diamnonds2 and lm1 are fine, but:

```
diamonds2 %>%
ggplot(aes(x = scale_price)) +
geom_density() +
coord_fixed(xlim = c(-3, 3)) +
scale_x_continuous(breaks = -3:3,
sec.axis = sec_axis(~ . * lm1$coefficients[[1]] + lm1$coefficients[[2]],
guide = guide_axis(position = "top"),
breaks = (-1:4) * 5000
)) +
facet_wrap(vars(cut), ncol = 2)
```

Error in sec_axis(~. * lm1$coefficients[[1]] + lm1$coefficients[[2]], :
unused argument (guide = guide_axis(position = "top"))

interesting, perhaps a version issue.
What do you get when you run

```
args(sec_axis)
```

nirgrahamuk:

`args(sec_axis)`

```
args(sec_axis)
function (trans = NULL, name = waiver(), breaks = waiver(), labels = waiver())
NULL
```

full console output:

```
(diamonds2 <- mutate(diamonds,
+ scale_price = scale(price) %>% as.numeric()
+ ))
# A tibble: 53,940 x 12
carat cut color clarity depth table price x y z price_scaled scale_price
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 -0.904 -0.904
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 -0.904 -0.904
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 -0.904 -0.904
4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 -0.902 -0.902
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 -0.902 -0.902
6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 -0.902 -0.902
7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 -0.902 -0.902
8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 -0.901 -0.901
9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 -0.901 -0.901
10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 -0.901 -0.901
# … with 53,930 more rows
> lm1 <- lm(price ~ scale_price, data = diamonds2)
>
> diamonds2 %>%
+ ggplot(aes(x = scale_price)) +
+ geom_density() +
+ coord_fixed(xlim = c(-3, 3)) +
+ scale_x_continuous(breaks = -3:3,
+ sec.axis = sec_axis(~ . * lm1$coefficients[[1]] + lm1$coefficients[[2]],
+ guide = guide_axis(position = "top"),
+ breaks = (-1:4) * 5000
+ )) +
+ facet_wrap(vars(cut), ncol = 2)
Error in sec_axis(~. * lm1$coefficients[[1]] + lm1$coefficients[[2]], :
unused argument (guide = guide_axis(position = "top"))
> args(sec_axis)
function (trans = NULL, name = waiver(), breaks = waiver(), labels = waiver())
NULL
```

I think that the guide param was added in the latest version of ggplot2 . so , you could try it without that and see what happens, or try to install the latest.
First restart R with Ctrl+Shift+F10 then

`update.packages(oldPkgs = "ggplot2")`

This works now. Thank you for the suggestion. I was hoping to find a way to display it underneath the existing horizontal axis. I tried following the solution over here but could not get it to work with this example. Do you know how?

```
(diamonds2 <- mutate(diamonds,
scale_price = scale(price) %>% as.numeric()
))
lm1 <- lm(price ~ scale_price, data = diamonds2)
text_labels <- data.frame(
x=-3:3,
y=1, # height of text
lab= as.character(round((-3:3) * lm1$coefficients[[1]] + lm1$coefficients[[2]],digits=0))
)
diamonds2 %>%
ggplot(aes(x = scale_price)) +
geom_density() +
coord_fixed(xlim = c(-3, 3),clip = "off") +
geom_text(data=text_labels,
mapping=aes(x=x,y=y,label=lab),vjust=6,
size=3)+
geom_text(data=text_labels,
mapping=aes(x=x,y=y,label=x),vjust=7.5,
size=3)+
facet_wrap(vars(cut), ncol = 2)+ theme(panel.spacing = unit(2, "lines"),
axis.line.x = element_blank(),
axis.text.x = element_blank(),
axis.title.x = element_blank())
```

1 Like

system
Closed
August 11, 2020, 3:07pm
11
This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.