我制作了一个看起来像这样的线图
我拥有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))
这个想法是让图形看起来像这样。
我尝试添加
group=country, color = country
它为所有国家输出着色。
如何为前4名和其他国家/地区上色?
PS:我对R仍然很天真。答案 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"))
该图表现在与预期结果非常相似。前4个国家/地区的行以不同颜色显示,而其他国家/地区以灰色显示但显示在右侧的颜色图例中。
请注意,仍需要group
审美,以便为每个国家/地区绘制一条线,而colour
由top_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))