图例标签到geom_line ggplot

时间:2019-04-27 10:50:57

标签: r ggplot2

使用CPDS(比较政治数据集-可下载的here),我想绘制新西兰的变量gov_left3gov_cent3gov_right3。对于gov_left3,我使用的是颜色tomato3;对于gov_cent3,我使用的是blue;对于gov_right3,我使用的是darkgreen。 当我使用ggplot绘制geom_line时,图形绘制得很完美,但是... -我可以不用图例很好地绘制图形 -如果我想要一个图例(那会很好),R会以某种方式混淆图例中gov_left3gov_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>我想正确

希望我能提供帮助所需的所有信息:)谢谢!

enter image description here

/编辑:根据PavoDive的帮助,我使用了melt函数将数据帧从宽转换为长。借助dplyrfilter的功能,我创建了一个包含三列 year variable 的数据框和 value (按年份排序)。 So far, so good, I guess

但是,如果我让arrange绘制图形,则结果为this 我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您可以通过在scale_color_*系列中设置新值来解决此问题,但是我发现您的方法存在潜在的问题。

似乎您正在使用一张宽桌子,而不是一张长桌子,这给了您不想要的问题,就像您问的那样。我将使用iris数据,因为您没有提供任何可重复的数据:

我将首先获得一张包含多年的表格:

dt <- iris[, 1:4] # scrapped the species variable
dt$year <- 1:150 # created a year variable

我可以绘制此图以在独立的Sepal-Length调用中调用每个变量(Petal.Widthgeom_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.namevalue.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")

得到这个:

enter image description here