[英]using y-axis values to create secondary x-axis in ggplot2
我想创建一个带百分位数的点图,看起来像这样 -
这是我用来创建点图的ggplot2
代码。 我想改变两件事:
y
轴上绘制百分位数值,但我想在x
轴上显示这些值(如上图所示)。 请注意,坐标是翻转的。 # loading needed libraries
library(tidyverse)
library(ggstatsplot)
# creating dataframe with mean mileage per manufacturer
cty_mpg <- ggplot2::mpg %>%
dplyr::group_by(.data = ., manufacturer) %>%
dplyr::summarise(.data = ., mileage = mean(cty, na.rm = TRUE)) %>%
dplyr::rename(.data = ., make = manufacturer) %>%
dplyr::arrange(.data = ., mileage) %>%
dplyr::mutate(.data = ., make = factor(x = make, levels = .$make)) %>%
dplyr::mutate(
.data = .,
percent_rank = (trunc(rank(mileage)) / length(mileage)) * 100
) %>%
tibble::as_data_frame(x = .)
# plot
ggplot2::ggplot(data = cty_mpg, mapping = ggplot2::aes(x = make, y = mileage)) +
ggplot2::geom_point(col = "tomato2", size = 3) + # Draw points
ggplot2::geom_segment(
mapping = ggplot2::aes(
x = make,
xend = make,
y = min(mileage),
yend = max(mileage)
),
linetype = "dashed",
size = 0.1
) + # Draw dashed lines
ggplot2::scale_y_continuous(sec.axis = ggplot2::sec_axis(trans = ~(trunc(rank(.)) / length(.)) * 100, name = "percentile")) +
ggplot2::coord_flip() +
ggplot2::labs(
title = "City mileage by car manufacturer",
subtitle = "Dot plot",
caption = "source: mpg dataset in ggplot2"
) +
ggstatsplot::theme_ggstatsplot()
由reprex包创建于2018-08-17(v0.2.0.9000)。
我不是百分百肯定已经理解了你真正想要的东西,但下面是我尝试用mpg数据重现第一张照片:
require(ggplot2)
data <- aggregate(cty~manufacturer, mpg, FUN = mean)
data <- data.frame(data[order(data$cty), ], rank=1:nrow(data))
g <- ggplot(data, aes(y = rank, x = cty))
g <- g + geom_point(size = 2)
g <- g + scale_y_continuous(name = "Manufacturer", labels = data$manufacturer, breaks = data$rank,
sec.axis = dup_axis(name = element_blank(),
breaks = seq(1, nrow(data), (nrow(data)-1)/4),
labels = 25 * 0:4))
g <- g + scale_x_continuous(name = "Mileage", limits = c(10, 25),
sec.axis = dup_axis(name = element_blank()))
g <- g + theme_classic()
g <- g + theme(panel.grid.major.y = element_line(color = "black", linetype = "dotted"))
print(g)
这产生:
data <- aggregate(cty~manufacturer, mpg, FUN = mean)
data <- data.frame(data[order(data$cty), ], rank=1:nrow(data))
这两行生成图表的数据。 基本上,我们需要的厂家,里程(平均cty
由manufacturer
)和等级。
g <- g + scale_y_continuous(name = "Manufacturer", labels = data$manufacturer, breaks = data$rank,
sec.axis = dup_axis(name = element_blank(),
breaks = seq(1, nrow(data), (nrow(data)-1)/4),
labels = 25 * 0:4))
请注意,此处的比例是使用rank
而不是列manufacturer
。 要显示制造商的名称,必须使用labels
属性,并且必须强制中断每个值(请参阅属性breaks
)。
使用sec.axis
属性生成第二个y-axis
。 使用可轻松复制轴的dup_axis
非常简单。 通过替换labels
和breaks
,您可以显示%-value。
g <- g + theme(panel.grid.major.y = element_line(color = "black", linetype = "dotted"))
水平线只是主要网格。 在我看来,这比geom_segments更容易操作。
关于您的问题1,您可以使用coord_flip
轻松翻转坐标,并进行微调。 替换以下行:
g <- g + theme(panel.grid.major.y = element_line(color = "black", linetype = "dotted")
通过以下两行:
g <- g + coord_flip()
g <- g + theme(panel.grid.major.x = element_line(color = "black", linetype = "dotted"),
axis.text.x = element_text(angle = 90, hjust = 1))
哪个产生:
关于你的问题2,问题是0%
的值超出了限制。 您可以通过更改计算百分比的方式(从零开始而不是从一个开始)来解决此问题,或者您可以扩展绘图的限制以包括零值,但是没有点将与0%相关联。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.