Легенда на ggplot2 с 3 графиками (по оси x)

avatar
user9613312
8 апреля 2018 в 01:01
48
1
1

Как создать легенду для следующих трех графиков по оси X? Спасибо за помощь!

library("ggplot2")

theme_set(theme_bw())# White background for plots

#creating 3 X 4 data frame (reduced from 50 x4 for 50 states)
state_name = as.factor(c("State_A","State_B","State_C"))

mw = c(7.25,11.5,7.25)
mw_tip = c(2.13,2.63,5.50)
mw_gap = mw-mw_tip
wage_data = data.frame(state_name,mw,mw_tip,mw_gap)

wage_data
str(wage_data)

#Re-order the df according to mw, mw_tip, mw_gap, 
#therefore, states won'd be listed alphabetically
#below, #ordering by mw, mw_tip, and gap

wage_data = wage_data[order(wage_data$mw,wage_data$mw_tip,wage_data$mw_gap),]
wage_data$state_name=factor(wage_data$state_name, as.character(unique(wage_data$state_name)))
wage_data #now ordered as State_A, State_C, State B that is plotted below

#Below, I plot 3 graphs: mw, mw_tip, mw_gap on the x-axis
(fig=ggplot(wage_data,aes(y=state_name,x=mw)))
(fig=fig+labs(x="Dollars per hour",y="50 U.S. States"))
(fig=fig+geom_point(size=3,color="green"))
(fig=fig+geom_point(aes(x=mw_tip),size=3,color="red",shape=17))
(fig=fig+geom_point(aes(x=mw_gap),size=3,color="orange",shape=15))
(fig=fig+scale_x_continuous(breaks=seq(0,11.5,0.5)))

#Below, legend does not work! I also tried with scale... 
#and with aes, nothing worked for me
(fig=fig+theme(legend.position = c(0.9,0.15),legend.justification = c(1,0), legend.title = element_blank()))
#End of code

Сюжеты, которым нужна легенда

enter image description here

Источник
user9613312
8 апреля 2018 в 01:42
0

Теперь я понимаю вашу точку зрения: fig = ggplot (xxx) вместо fig = ggplot (xxx), спасибо!

Maurits Evers
8 апреля 2018 в 01:49
1

Я имел в виду, что добавление интервала между операторами почти всегда является хорошей идеей (если только вы не играете в гольф) и повышает удобочитаемость. См., например. Руководство по стилю Google R. Кроме того, пожалуйста, смотрите мой ответ ниже.

Ответы (1)

avatar
Maurits Evers
8 апреля 2018 в 01:29
0

Я советую вам избегать разных вызовов goem_point для каждого столбца; вместо этого вы можете изменить форму данных с широкой на длинную перед построением графика и использовать клавишу what в качестве цветовой эстетики. Это автоматически вводит соответствующую легенду.

state_name <- factor(c("State_A", "State_B", "State_C"))
mw <- c(7.25, 11.5, 7.25)
mw_tip <- c(2.13, 2.63, 5.50)
mw_gap <- mw - mw_tip
wage_data <- data.frame(state_name, mw, mw_tip, mw_gap)

library(tidyverse);
wage_data %>%
    gather(what, value, -state_name) %>%
    ggplot(aes(value, state_name, colour = what, group = what)) +
    geom_line()

enter image description here

Или используя geom_point с другими символами:

wage_data %>%
    gather(what, value, -state_name) %>%
    ggplot(aes(value, state_name, colour = what, shape = what)) +
    geom_point()

enter image description here

user9613312
8 апреля 2018 в 02:14
0

Ваше решение работает! Сначала я беспокоился, что переход от широкого к длинному может привести к изменению уровней факторов, потому что на вашем графике «mw» не упорядочена от низкого к высокому. Однако я только что проверил ваше решение на своем упорядоченном фрейме данных, и кажется, что порядок сохранился.

Maurits Evers
8 апреля 2018 в 04:31
0

@user9613312 user9613312 Вы всегда можете изменить порядок уровней фактора после изменения формы, если это необходимо. Пожалуйста, рассмотрите возможность закрытия вопроса, установив галочку рядом с решением.