使用CPDS(比较政治数据集-可下载的here),我想绘制新西兰的变量gov_left3
,gov_cent3
和gov_right3
。对于gov_left3
,我使用的是颜色tomato3
;对于gov_cent3
,我使用的是blue
;对于gov_right3
,我使用的是darkgreen
。
当我使用ggplot
绘制geom_line
时,图形绘制得很完美,但是...
-我可以不用图例很好地绘制图形
-如果我想要一个图例(那会很好),R会以某种方式混淆图例中gov_left3
和gov_right3
的颜色。
-如果我使用scale_color_manual
重新标记图例标签,则颜色在图例中正确,但在图形中错误。
我尝试使用多个以scale
开头的命令,但没有找到解决方案。我想这真的很简单,但是我看不到。
我是否需要将数据框从长/宽调整为宽/长?
# Import data
CPDS <- readxl::read_excel("~/Daten/CPDS.xlsx")
# Filter data
NZL <- dplyr::filter(CPDS, iso == "NZL")
# Draw geom_line -> this actually gets me the right graph and a correct legend, all I want to do now is relabel my legend
n <- ggplot() +
geom_line(data=NZL, aes(y=gov_left3, x=year, colour="tomato3"), size=0.7, linetype = "dashed") +
geom_line(data=NZL, aes(y=gov_cent3, x=year, colour="blue"), size=0.7, linetype = "dashed") +
geom_line(data=NZL, aes(y=gov_right3, x=year, colour="darkgreen"), size=0.7, linetype = "dashed")
n1 <- n + geom_vline(xintercept = 1994, color="red", size=1, alpha=0.75) +
theme_minimal() +
labs(title = "Parliamentary seat share of all parties", subtitle = "New Zealand government, 1960 to 2014",
x="Year", y="Seat share in %", caption = "Source: CPDS") +
theme(plot.title = element_text(size=20, face="bold", margin = margin(10, 0, 10, 0)),
axis.text.x = element_text(angle=45, vjust=0.5), legend.title = element_text(size=12, face="bold")) +
scale_x_continuous(breaks = c(1960, 1970, 1980, 1990, 2000, 2010)) +
scale_color_identity(guide="legend")
绘制n1可得到我想要的图形,但我想更改图例。因此,我希望使用聚会类型作为标题,而不是颜色。然后,对于 blue ,我想要标签 centre ,对于 tomato3 left 和 darkgreen em>我想正确。
希望我能提供帮助所需的所有信息:)谢谢!
/编辑:根据PavoDive的帮助,我使用了melt
函数将数据帧从宽转换为长。借助dplyr
和filter
的功能,我创建了一个包含三列 year , variable 的数据框和 value (按年份排序)。
答案 0 :(得分:1)
您可以通过在scale_color_*
系列中设置新值来解决此问题,但是我发现您的方法存在潜在的问题。
似乎您正在使用一张宽桌子,而不是一张长桌子,这给了您不想要的问题,就像您问的那样。我将使用iris
数据,因为您没有提供任何可重复的数据:
我将首先获得一张包含多年的表格:
dt <- iris[, 1:4] # scrapped the species variable
dt$year <- 1:150 # created a year variable
我可以绘制此图以在独立的Sepal-Length
调用中调用每个变量(Petal.Width
,geom_line
等)。但是正确的做法是将数据从宽转换为长。为此,我将使用data.table::melt
:
require(data.table) # library(data.table) too!
df2 <- melt(df, id.vars = "year") # check df2: is a long table now
# now the plotting part:
require(ggplot2)
ggplot(df2, aes(x = year, y = value, color = variable))+geom_line()
现在您的地块上有足够的标签,这是一个简单的调用。当然,您既可以在调用df2
时重命名melt
的列(参数variable.name
和value.name
),也可以直接使用names(df2) <-
####编辑以添加:####
要更改图例中的名称和值,请在ggplot链的末尾使用此 :
+scale_color_discrete(labels = c("center", "right", "left"), name = "Political Orientation")
答案 1 :(得分:0)
将数据从宽到长整形之后,我发现(几小时后)列value
被存储为字符值,而不是数字。因此,我必须使用命令将变量转换为数字
mNZL2$value <- as.numeric(as.character(mNZL2$value))
。
将整个内容绘制成这样:
ggplot(data=mNZL2, aes(x=year, y=as.numeric(value), colour=variable)) +
geom_line(linetype="dashed", size=0.6) +
geom_vline(xintercept = 1996, color="red", size=1, alpha=0.75) +
theme_minimal() +
labs(title = "Parliamentary seat share of all parties",
subtitle = "New Zealand government, 1960 to 2016",
x="Year",
y="Seat share in %", caption = "Source: CPDS") +
theme(plot.title = element_text(size=20, face="bold",
margin = margin(10, 0, 10, 0)),
axis.text.x = element_text(angle=45, vjust=0.5),
legend.title = element_text(size=12, face="bold")) +
scale_x_continuous(breaks = c(1960, 1970, 1980, 1990, 2000, 2010)) +
scale_color_brewer(palette = "Accent",
name = "Party types",
labels=c("Right","Centre","Left")) +
annotate("segment", x = 2002, xend = 1997, y = 65, yend = 60,
color = "red", size = 1, alpha = 0.75, arrow = arrow()) +
annotate("text", x = 2008, y = 65, label = "First MMP election",
color = "red", fontface = "bold")
得到这个: