我需要为两个变量生成带条形图的图,并使用第三个变量生成一条线。
我可以为下面的一个变量创建一个列图
df <- head(mtcars)
df$car <- row.names(df)
ggplot(df) + geom_col(aes(x=car, y=disp))
参考this回答 - 我可以绘制两个变量 - disp
和hp
如下
library(tidyr)
df$car = row.names(df)
df_long = gather(df, key = var, value = value, disp, hp)
ggplot(df_long, aes(x = car, y = value, fill = var)) +
geom_bar(stat = 'identity', position = 'dodge')
我需要将第三个变量qsec
绘制成如下图所示的线 - 如何进行此操作?
您需要另一个图层,因为geom_line
用于连续数据,您需要做的就像您的x值是用于线图层一样。通过这样做,数据的顺序变得至关重要,因此您还需要对其进行排序:
gather(df, key = var, value = value, disp, hp, qsec) %>%
arrange(car) %>%
{
print(
ggplot() +
geom_bar(stat = 'identity', position = 'dodge', data = filter(., var != "qsec"), mapping = aes(x = car, y = value, fill = var)) +
geom_line(mapping = aes(x = 1:length(car), y = value), data = filter(., var == "qsec"))
)
}
编辑:
顺便说一下,你可以通过调用qsec
来检查plotly::ggplotly()
到相应x值的正确顺序,然后你可以更好地读取值并将它们与df
进行比较,因为如果你指向元素它们会显示出来......
你可以试试:
library(tidyverse)
mtcars %>%
mutate(car = rownames(mtcars)) %>%
slice(1:6) %>%
select(car, disp, hp) %>%
gather(key, value, -car) %>%
group_by(car) %>%
mutate(qsec_value = median(value)) %>%
mutate(qsec = factor("qsec")) %>%
ggplot() +
geom_col(aes(x=car, y=value, fill = key), position = "dodge") +
geom_point(aes(x=car, y=qsec_value,color = qsec)) +
geom_line(aes(x=car, y=qsec_value, color = qsec, group =1)) +
scale_colour_manual(name= "", values = 1) +
theme(legend.position = "top",
legend.title = element_blank())