如何通过对R中的变量进行分组来为线图着色?

时间:2017-04-07 19:57:53

标签: r ggplot2

我制作了一个看起来像这样的线图

Generated using ggplot2

我拥有50个国家的数据和过去10年的国内生产总值 样本数据:

Country variable value  
China   Y2007    3.55218e+12
USA     Y2007    1.45000e+13
Japan   Y2007    4.51526e+12
UK      Y2007    3.06301e+12
Russia  Y2007    1.29971e+12 
Canada  Y2007    1.46498e+12
Germany Y2007    3.43995e+12 
India   Y2007    1.20107e+12
France  Y2007    2.66311e+12
SKorea  Y2007    1.12268e+12

我使用代码

生成了折线图
GDP_lineplot = ggplot(data=GDP_linechart, aes(x=variable,y=value)) + 
  geom_line() + 
  scale_y_continuous(name = "GDP(USD in Trillions)", 
                     breaks = c(0.0e+00,5.0e+12,1.0e+13,1.5e+13), 
                     labels = c(0,5,10,15)) + 
  scale_x_discrete(name = "Years", labels = c(2007,"",2009,"",2011,"",2013,"",2015))

这个想法是让图形看起来像这样。 How can I plot the colors

我尝试添加

group=country, color = country

它为所有国家输出着色。

如何为前4名和其他国家/地区上色?

PS:我对R仍然很天真。

2 个答案:

答案 0 :(得分:1)

通过绘制子集,其他组不包含在右侧的颜色图例中。下面的替代方法操纵因子水平并使用自定义色标来克服这个问题。

准备数据

假设GDP_long包含长格式的数据。这与OP显示的数据一致(GDP_lineplot,但请参阅下面的数据部分以了解差异)。要操纵因子级别,请使用forcats包(和data.table)。

library(data.table)
library(forcats)
# coerce to data.table, reorder factors by values in last = most actual year
setDT(GDP_long)[, Country := fct_reorder(Country, -value, last)]
# create new factor which collapses all countries to "Other" except the top 4 countries
GDP_long[, top_country := fct_other(Country, keep = head(levels(Country), 4))]

创建情节

library(ggplot2)
ggplot(GDP_long, aes(Year, value/1e12, group = Country, colour = top_country)) + 
  geom_point() + geom_line(size = 1) + theme_bw() + ylab("GDP(USD in Trillions)") +
  scale_colour_manual(name = "Country", 
                      values = c("green3", "orange", "blue", "red", "grey"))

enter image description here

该图表现在与预期结果非常相似。前4个国家/地区的行以不同颜色显示,而其他国家/地区以灰色显示但显示在右侧的颜色图例中。

请注意,仍需要group审美,以便为每个国家/地区绘制一条线,而colourtop_country级别控制。

数据

数据集太大而无法在此处复制(即使使用dput())。结构

str(GDP_long)
'data.frame':   1763 obs. of  3 variables:
 $ Country: chr  "Afghanistan" "Albania" "Algeria" "Andorra" ...
 $ Year   : int  2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
 $ value  : num  9.84e+09 1.07e+10 1.35e+11 4.01e+09 6.04e+10 ...

类似于OP的数据,但variable列已经转换为整数列year。这将提供格式良好的x轴,无需额外的努力。

答案 1 :(得分:0)

我很抱歉我错过了关于只为一部分国家着色的部分...在geom_line调用中,您可以添加适合您需要的子集。

df <- data.frame(Country=rep(LETTERS[1:10], each=5),
    Year=rep(2007:2011, length.out=10), 
    value=rnorm(50))

ggplot(df) +
 geom_line(data=df[21:50, ], aes(x=Year, y=value, group=Country), color="#999999") +
 geom_line(data=df[1:20, ], aes(Year, y=value, color=Country))

enter image description here