[英]recreating advanced base R plot with ggplot2
下面的代碼使用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)
這是一個開始。 我將dplyr
函數合並到一個流中,只是為了避免分配和重新分配變量d
。 我添加了一個mutate
呼叫,使得category
的一個因素,有序基於的對應值defect
,使用fct_reorder
從forcats
(附帶tidyverse
)。
我不確定的是如何讓左y軸斷裂。 我通過獲取d$cumsum
的唯一值來手動設置它們,但是可能有一種方法可以在scale_y_continuous
的breaks
參數中為它編寫函數。
較新版本的ggplot2
允許輔助軸,但它需要基於主軸的轉換。 在這種情況下,這意味着它應該采用主軸的值並除以最大值以獲得百分比。
正如@ClausWilke在評論中指出的那樣,為確保輔助軸與數據正確對齊,使得頂點為100%,請使用~. / max(d$cumsum)
~. / 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包 (v0.2.0)於2018-05-12創建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.