【问题标题】:recreating advanced base R plot with ggplot2使用 ggplot2 重新创建高级基础 R 图
【发布时间】:2018-10-22 02:14:32
【问题描述】:

下面的代码使用 R 中的基本绘图函数创建一个帕累托图。如何使用 ggplot 创建相同的图表?

*我知道有些人会讨厌带有两个 y 轴的情节。请不要在这篇文章中包含这场辩论。谢谢

## Creating the d tribble
library(tidyverse)
d <- tribble(
  ~ category, ~defect,
  "price", 80,
  "schedule", 27,
  "supplier", 66,
  "contact", 94,
  "item", 33
)

## Creating new columns
d <- arrange(d, desc(defect)) %>%
  mutate(
    cumsum = cumsum(defect),
    freq = round(defect / sum(defect), 3),
    cum_freq = cumsum(freq)
  )

## Saving Parameters 
def_par <- par() 

## New margins
par(mar=c(5,5,4,5)) 

## bar plot, pc will hold x values for bars
pc = barplot(d$defect,  
             width = 1, space = 0.2, border = NA, axes = F,
             ylim = c(0, 1.05 * max(d$cumsum, na.rm = T)), 
             ylab = "Cummulative Counts" , cex.names = 0.7, 
             names.arg = d$category,
             main = "Pareto Chart (version 1)")

## Cumulative counts line 
lines(pc, d$cumsum, type = "b", cex = 0.7, pch = 19, col="cyan4")

## Framing plot
box(col = "grey62")

## adding axes
axis(side = 2, at = c(0, d$cumsum), las = 1, col.axis = "grey62", col = "grey62", cex.axis = 0.8)
axis(side = 4, at = c(0, d$cumsum), labels = paste(c(0, round(d$cum_freq * 100)) ,"%",sep=""), 
     las = 1, col.axis = "cyan4", col = "cyan4", cex.axis = 0.8)

## restoring default paramenter
par(def_par) 

【问题讨论】:

标签: r ggplot2


【解决方案1】:

这是一个开始。我将您的dplyr 函数组合成一个流,只是为了避免分配和重新分配变量d。我添加了一个mutate 调用,它使category 成为一个因素,根据defect 的相应值排序,使用来自forcatsfct_reorder(与tidyverse 一起提供)。

我不确定如何让左侧 y 轴中断。我通过获取d$cumsum 的唯一值手动设置它们,但可能有一种方法可以在scale_y_continuousbreaks 参数中为其编写函数。

ggplot2 的最新版本允许使用辅助轴,但它需要基于主轴的转换。在这种情况下,这意味着它应该取主轴的值并除以最大值以获得百分比。

正如@ClausWilke 在 cmets 中所指出的,要确保辅助轴与数据正确对齐,以使顶点位于 100%,请在设置辅助轴时使用 ~. / max(d$cumsum)

library(tidyverse)

d <- tribble(
    ~ category, ~defect,
    "price", 80,
    "schedule", 27,
    "supplier", 66,
    "contact", 94,
    "item", 33
) %>% arrange(desc(defect)) %>%
    mutate(
        cumsum = cumsum(defect),
        freq = round(defect / sum(defect), 3),
        cum_freq = cumsum(freq)
    ) %>%
    mutate(category = as.factor(category) %>% fct_reorder(defect))

brks <- unique(d$cumsum)

ggplot(d, aes(x = fct_rev(category))) +
    geom_col(aes(y = defect)) +
    geom_point(aes(y = cumsum)) +
    geom_line(aes(y = cumsum, group = 1)) +
    scale_y_continuous(sec.axis = sec_axis(~. / max(d$cumsum), labels = scales::percent), breaks = brks)

reprex package (v0.2.0) 于 2018 年 5 月 12 日创建。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2010-12-16
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多