繁体   English   中英

使用y轴值在ggplot2中创建辅助x轴

[英]using y-axis values to create secondary x-axis in ggplot2

我想创建一个带百分位数的点图,看起来像这样 -

在此输入图像描述

这是我用来创建点图的ggplot2代码。 我想改变两件事:

  1. 我可以在y轴上绘制百分位数值,但我想在x轴上显示这些值(如上图所示)。 请注意,坐标是翻转的。
  2. 轴不显示最小值的标签(例如,百分位轴标签从25开始时应从0开始。)
# 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))

这两行生成图表的数据。 基本上,我们需要的厂家,里程(平均ctymanufacturer )和等级。

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非常简单。 通过替换labelsbreaks ,您可以显示%-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM