gpt4 book ai didi

使用 ggplot2 重新创建高级基础 R 图

转载 作者:行者123 更新时间:2023-12-04 22:39:57 25 4
gpt4 key购买 nike

下面的代码使用 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)

download.png

最佳答案

这是一个开始。我结合了你的 dplyr函数合并到一个流中,只是为了避免分配和重新分配变量 d .我添加了 mutate调用category的电话一个因子,根据 defect 的对应值排序, 使用 fct_reorder来自 forcats (附带 tidyverse )。

我不确定的是如何让左 y 轴中断。我通过获取 d$cumsum 的唯一值手动设置它们, 但可能有一种方法可以在 breaks 中为其编写函数scale_y_continuous 中的参数.
ggplot2 的更新版本允许辅助轴,但它需要基于主轴的变换。在这种情况下,这意味着它应该取主轴的值并除以最大值以获得百分比。

正如@ClausWilke 在评论中指出的那样,要确保辅助轴与数据正确对齐,以使顶点位于 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)



创建于 2018-05-12 由 reprex package (v0.2.0)。

关于使用 ggplot2 重新创建高级基础 R 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com