4

I have a dataset consisting of 3 variables (a, b, c) and one response (d).

 df <- structure(list(a = c(0.9973, 0.9965, 1.002, 1.0019, 1.001, 1.0031, 1.0005, 1.0009, 1.0007, 0.9977, 1.0004, 1.001, 0.9936, 0.9945, 1.0056, 1.0004, 0.9969, 0.9977, 1.001, 0.9876), b = c(-4.0841, -4.216, -4.1469, -4.1418, -4.1919, -4.1953, -4.3314, -4.1205, -4.2449, -4.0841, -4.276, -4.3396, -4.2885, -4.1386, -4.0689, -4.2229, -4.3886, -4.2267, -4.0344, -4.6152), c = c(32.04, 18.52, 26.01, 25.65, 21.44, 22.26, 21.8, 21.6, 17.38, 13.84, 20.19, 27.66, 20.85, 18.71, 22.18, 17.25, 26.78, 28.08, 25.9, 16.68), d = c(2241, 2231, 2231, 2220, 2218, 2216, 2210, 2204, 2202, 2194, 2157, 2028, 1853, 1850, 1770, 1755, 1679, 1673, 1673, 1645)), .Names = c("a", "b", "c", "d"), class = "data.frame", row.names = c(NA, -20)) 

My goal is to use facet in ggplot2 to create a plot with a common y-axis of d, and three facets having x-axes of a, b, and c respectively -- in other words, d vs a, d vs. b, and d vs. c adjacent to each other with a common y-axis. An approximation of my goal can be shown in base R with:

par(mfrow=c(1,3)) plot(df$a, df$d) plot(df$b, df$d) plot(df$c, df$d) 

I'd like to do this with ggplot and without repeating the y-axis. I've seen similar plots, but they usually involve one x-axis repeated several times. I've tried to melt the data (i.e. from reshape2) but I haven't come up with an orientation that works for me.

It would also be visually desirable to have each of d vs. a, d vs. b, and d vs. c be a different color.

Thanks in advance for your help!

1

2 Answers 2

3

You're on the right track. We need to convert df to long format (tidyr::gather for example) then use ggplot::facet_grid to get the desired plot

df <- structure(list(a = c(0.9973, 0.9965, 1.002, 1.0019, 1.001, 1.0031, 1.0005, 1.0009, 1.0007, 0.9977, 1.0004, 1.001, 0.9936, 0.9945, 1.0056, 1.0004, 0.9969, 0.9977, 1.001, 0.9876), b = c(-4.0841, -4.216, -4.1469, -4.1418, -4.1919, -4.1953, -4.3314, -4.1205, -4.2449, -4.0841, -4.276, -4.3396, -4.2885, -4.1386, -4.0689, -4.2229, -4.3886, -4.2267, -4.0344, -4.6152), c = c(32.04, 18.52, 26.01, 25.65, 21.44, 22.26, 21.8, 21.6, 17.38, 13.84, 20.19, 27.66, 20.85, 18.71, 22.18, 17.25, 26.78, 28.08, 25.9, 16.68), d = c(2241, 2231, 2231, 2220, 2218, 2216, 2210, 2204, 2202, 2194, 2157, 2028, 1853, 1850, 1770, 1755, 1679, 1673, 1673, 1645)), .Names = c("a", "b", "c", "d"), class = "data.frame", row.names = c(NA,-20)) library(tidyverse) df_long <- df %>% gather(key, value, a:c) ggplot(df_long, aes(x = d, y = value, color = key)) + geom_point() + facet_grid(~ key) + theme_bw() 

ggplot(df_long, aes(x = d, y = value, color = key)) + geom_line() + facet_grid(~ key)+ theme_bw() 

ggplot(df_long, aes(x = d, y = value, color = key, fill = key)) + geom_col() + facet_grid(~ key)+ theme_bw() 

Created on 2018-06-07 by the reprex package (v0.2.0).

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, that's close, but not quite right. I need "d" to be the y-axis (common to all three plots), and then from right to left I want the plots to have a, b, and c respectively as the x-axis. Unfortunately, simply flipping the x and y in the code produces an undesirable result: ggplot(df_long, aes(x = key, y = d, color = key)) + geom_point() + facet_grid(~ key)
1

Thank you, Tung and Amanda for getting me on the right track. The key is to use facet_wrap rather than facet_grid. Once the data is in the proper long format as mentioned above:

library(tidyverse) df_long <- df %>% gather(key, value, a:c) 

then this version does the trick:

ggplot(df_long, aes(x = value, y = d, color = key)) + geom_point() + facet_wrap(~ key, scales="free_x") 

1 Comment

You get the same result with facet_grid(~ key, scales = "free_x")

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.