20

ggplot2パッケージを使用してRでパレート図を作成する方法に苦労しています。多くの場合、棒グラフやヒストグラムを作成するときは、アイテムをX軸で並べ替える必要があります。パレート図では、Y軸の値の降順で並べ替えられたアイテムが必要です。Y軸の値順に並べられたアイテムをggplotにプロットさせる方法はありますか?最初にデータフレームを並べ替えようとしましたが、ggplotがそれらを並べ替えているようです。

例:

val <- read.csv("http://www.cerebralmastication.com/wp-content/uploads/2009/11/val.txt")
val<-with(val, val[order(-Value), ])
p <- ggplot(val)
p + geom_bar(aes(State, Value, fill=variable), stat = "identity", position="dodge") + scale_fill_brewer(palette = "Set1")

データフレームの値は並べ替えられますが、出力は次のようになります。

代替テキスト
(出典:cerebralmastication.com

ハドリーは、これにより、実際と予測を表示するためのはるかに優れたグラフィックが生成されることを正しく指摘しました。

ggplot(val, aes(State, Value)) + geom_bar(stat = "identity", subset = .(variable == "estimate"), fill = "grey70") + geom_crossbar(aes(ymin = Value, ymax = Value), subset = .(variable == "actual"))

これは次を返します:

代替テキスト
(出典:cerebralmastication.com

しかし、それはまだパレート図ではありません。任意のヒント?

4

8 に答える 8

23

データのサブセット化と並べ替え。

valact <- subset(val, variable=='actual')
valsort <- valact[ order(-valact[,"Value"]),]

そこから、それboxplot()は非常に手動の累積関数が上にある単なる標準です:

op <- par(mar=c(3,3,3,3)) 
bp <- barplot(valsort [ , "Value"], ylab="", xlab="", ylim=c(0,1),    
              names.arg=as.character(valsort[,"State"]), main="How's that?") 
lines(bp, cumsum(valsort[,"Value"])/sum(valsort[,"Value"]), 
      ylim=c(0,1.05), col='red') 
axis(4)
box() 
par(op)

このように見えるはずです

代替テキスト
(出典:eddelbuettel.com

lines()また、最初のプロットに喜んで注釈を付けるため、オーバープロットのトリックも必要ありません。

于 2009-11-14T21:20:44.070 に答える
16

ggplot2のバーは、因子のレベルの順序で並べられています。

val$State <- with(val, factor(val$State, levels=val[order(-Value), ]$State))
于 2009-11-15T00:37:09.690 に答える
7

ggplot2の従来のパレート図......。

Cano、EL、Moguerza、JM、およびRedchuk、A.(2012)を読んだ後に開発されました。シックスシグマとR.(G. Robert、K. Hornik、&G。Parmigiani、Eds。)Springer。

library(ggplot2);library(grid)

counts  <- c(80, 27, 66, 94, 33)
defects <- c("price code", "schedule date", "supplier code", "contact num.", "part num.")
dat <- data.frame(count = counts, defect = defects, stringsAsFactors=FALSE )
dat <- dat[order(dat$count, decreasing=TRUE),]
dat$defect <- factor(dat$defect, levels=dat$defect)
dat$cum <- cumsum(dat$count)
count.sum<-sum(dat$count)
dat$cum_perc<-100*dat$cum/count.sum

p1<-ggplot(dat, aes(x=defect, y=cum_perc, group=1))
p1<-p1 + geom_point(aes(colour=defect), size=4) + geom_path()

p1<-p1+ ggtitle('Pareto Chart')+ theme(axis.ticks.x = element_blank(), axis.title.x = element_blank(),axis.text.x = element_blank())
p1<-p1+theme(legend.position="none")

p2<-ggplot(dat, aes(x=defect, y=count,colour=defect, fill=defect))
p2<- p2 + geom_bar()

p2<-p2+theme(legend.position="none")

plot.new()
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 1)))
print(p1, vp = viewport(layout.pos.row = 1,layout.pos.col = 1))
print(p2, vp = viewport(layout.pos.row = 2,layout.pos.col = 1))
于 2012-10-11T12:28:41.247 に答える
4

簡単な例で:

 > data
    PC1     PC2     PC3     PC4     PC5     PC6     PC7     PC8     PC9    PC10 
0.29056 0.23833 0.11003 0.05549 0.04678 0.03788 0.02770 0.02323 0.02211 0.01925 

barplot(data)物事を正しく行う

ggplotに相当するものは「あるべき」です:qplot(x=names(data), y=data, geom='bar')

しかし、それはバーをアルファベット順に誤って並べ替え/並べ替えます...それがどのように並べ替えられるかだからですlevels(factor(names(data)))

解決:qplot(x=factor(names(data), levels=names(data)), y=data, geom='bar')

ふぅ!

于 2010-03-30T18:47:15.847 に答える
3

また、関数を持つパッケージqccpareto.chart()を参照してください。ベースグラフィックも使用しているように見えるので、ggplot2-solutionの報奨金を開始します:-)

于 2009-11-14T22:03:28.703 に答える
3

ggQCパッケージを使用できます。

library(ggplot2)
library(ggQC)
Data4Pareto <- data.frame(
  KPI = c("Customer Service Time", "Order Fulfillment", "Order Processing Time",
          "Order Production Time", "Order Quality Control Time", "Rework Time",
          "Shipping"),
  Time = c(1.50, 38.50, 3.75, 23.08, 1.92, 3.58, 73.17)) 


ggplot2::ggplot(Data4Pareto, aes(x = KPI, y = Time)) +
 ggQC::stat_pareto(point.color = "red",
                   point.size = 3,
                   line.color = "black",
                   bars.fill = c("blue", "orange")) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust=0.5))

ここに画像の説明を入力してください

ソース

于 2019-12-17T03:10:56.280 に答える
1

簡単にするために、見積もりの​​みを考えてみましょう。

estimates <- subset(val, variable == "estimate")

まず、因子レベルを並べ替えて、Statesが。の降順でプロットされるようにしValueます。

estimates$State <- with(estimates, reorder(State, -Value))

同様に、データセットを並べ替えて累積値を計算します。

estimates <- estimates[order(estimates$Value, decreasing = TRUE),]
estimates$cumulative <- cumsum(estimates$Value)

これで、プロットを描く準備ができました。同じ軸上に線と棒を配置する秘訣は、状態変数(係数)を数値に変換することです。

p <- ggplot(estimates, aes(State, Value)) + 
  geom_bar() +
  geom_line(aes(as.numeric(State), cumulative))
p

質問で述べたように、2つの変数グループの2つのパレートプロットを隣り合わせに描画しようとするのは簡単ではありません。複数のパレートプロットが必要な場合は、ファセットを使用する方がよいでしょう。

于 2010-09-28T10:09:15.683 に答える
0
freqplot = function(x, by = NULL, right = FALSE)
{
if(is.null(by)) stop('Valor de "by" precisa ser especificado.')
breaks = seq(min(x), max(x), by = by )
ecd = ecdf(x)
den = ecd(breaks)
table = table(cut(x, breaks = breaks, right = right))
table = table/sum(table)

intervs = factor(names(table), levels = names(table))
freq = as.numeric(table/sum(table))
acum = as.numeric(cumsum(table))

normalize.vec = function(x){
  (x - min(x))/(max(x) - min(x))
}

dados = data.frame(classe = intervs, freq = freq, acum = acum, acum_norm = normalize.vec(acum))
p = ggplot(dados) + 
  geom_bar(aes(classe, freq, fill = classe), stat = 'identity') +
  geom_point(aes(classe, acum_norm, group = '1'), shape = I(1), size = I(3), colour = 'gray20') +
  geom_line(aes(classe, acum_norm, group = '1'), colour = I('gray20'))

p
}
于 2013-02-21T19:49:14.633 に答える