4

我正在尝试使用 ggplot 按公司绘制生产数据,并使用点的颜色来指定年份。下图显示了基于样本数据的示例: 在此处输入图像描述

然而,很多时候我的真实数据有 50-60 个不同的公司,这使得 Y 轴上的公司名称被紧密地分组,并且不是很讨人喜欢。

仅显示前 5 名公司信息的数据(按 2011 年数量排名)然后显示其余汇总并显示为“其他”的最简单方法是什么?

下面是一些示例数据和我用来创建示例图表的代码:

# create some sample data
c=c("AAA","BBB","CCC","DDD","EEE","FFF","GGG","HHH","III","JJJ")

q=c(1,2,3,4,5,6,7,8,9,10)
y=c(2010)
df1=data.frame(Company=c, Quantity=q, Year=y)

q=c(3,4,7,8,5,14,7,13,2,1)
y=c(2011)
df2=data.frame(Company=c, Quantity=q, Year=y)

df=rbind(df1, df2)

# create plot
p=ggplot(data=df,aes(Quantity,Company))+
  geom_point(aes(color=factor(Year)),size=4)
p

我开始走蛮力方法的道路,但认为可能有一种简单而优雅的方法可以做到这一点,我应该学习。任何帮助将不胜感激。

4

2 回答 2

6

那这个呢:

    df2011 <- subset (df, Year == 2011)
    companies <- df2011$Company [order (df2011$Quantity, decreasing = TRUE)]
    ggplot (data = subset (df, Company %in% companies [1 : 5]), 
            aes (Quantity, Company)) +
            geom_point (aes (color = factor (Year)), size = 4)

顺便说一句:为了让代码被称为优雅,多花一些空间,它们并没有那么贵......

于 2012-04-19T19:42:28.747 回答
3

看看这是不是你想要的。它需要您的df数据框,以及@cbeleites 已经提出的一些想法。步骤是:

1.选择2011年的数据,按数量从高到低排列公司。

2.df分为两位:dftop其中包含前5位的数据;和dfother,其中包含其他公司的汇总数据(使用ddply()来自 plyr 包)。

3.将两个数据框放在一起给出dfnew

4.设置公司级别的绘制顺序:从上到下从最高到最低,然后是“其他”。订单部分由companies加上“其他”给出。

5. 像以前一样绘制。

library(ggplot2)
library(plyr)

# Step 1
df2011 <- subset (df, Year == 2011)
companies <- df2011$Company [order (df2011$Quantity, decreasing = TRUE)]

# Step 2
dftop = subset(df, Company %in% companies [1:5])
dftop$Company = droplevels(dftop$Company)

dfother = ddply(subset(df, !(Company %in% companies [1:5])), .(Year), summarise, Quantity = sum(Quantity))
dfother$Company = "Other"

# Step 3
dfnew = rbind(dftop, dfother)

# Step 4
dfnew$Company = factor(dfnew$Company, levels = c("Other", rev(as.character(companies)[1:5])))
levels(dfnew$Company)    # Check that the levels are in the correct order

# Step 5
p = ggplot (data = dfnew, aes (Quantity, Company)) +
        geom_point (aes (color = factor (Year)), size = 4)
p

代码产生:

在此处输入图像描述

于 2012-04-20T05:40:26.090 回答