Как вы можете использовать directlabels и ggplot2? - PullRequest
7 голосов
/ 27 июня 2011

Я пытаюсь использовать пакет directlabels , чтобы обозначить две строки, которые у меня есть, на простом графике (я использую ggplot2 )

enter image description here

Мой код выглядит следующим образом:

# libraries
library(ggplot2)
library(directlabels)

# Variables
A = array(1000,100)
F = seq(length=100, from=0, by=10)
f = array(5,100)

# make data frame 1
df <- data.frame(X = F * f/A, Y = F/A)

# plot line 1
p = ggplot(df, aes(x=X,y=Y)) 
p = p + geom_line(colour="#56B4E9") 

# make data frame 2
df1 <- data.frame(X = F * f * 2/A, Y = F/A)

# plot line 2
p =  p + geom_line(aes(x=X,y=Y), data=df1, colour="#56B4E9")    

# label line
direct.label(p, 'last.points')

Однако я получаю следующее сообщение об ошибке:

Error in direct.label.ggplot(p, "last.points") : 
  Need colour aesthetic to direct label.

Я пытался добавить несколько аргументов в функцию direct.label(), но я не понимаю, какой эстетический аргумент следует использовать.

1 Ответ

15 голосов
/ 27 июня 2011

Вместо того, чтобы использовать 2 кадра данных, вы можете объединить и растопить их:

library(ggplot2)
library(directlabels)

# Variables
A = array(1000,100)
F = seq(length=100, from=0, by=10)
f = array(5,100)

# make data frame 1
df <- data.frame(X = F * f/A, Y = F/A)

# make data frame 2
df1 <- data.frame(X = F * f * 2/A, Y = F/A)

# merge both dataframes
df2 <- merge(df, df1, by = "X")

# melt them
df2m <- melt(df2, id = "X")

# plot 
p2 <- ggplot(df2m, aes(x = X, y = value, col = variable)) +
  geom_line() +
  scale_color_manual(values = rep("#56B4E9", 2))

direct.label(p2, 'last.points')

Вы также можете использовать новый geom_dl из directlabels 2.0, если вы хотите использовать прямые метки, но не хотите использовать цветэстетика:

install.packages("directlabels")
ggplot(df2m, aes(x = X, y = value))+
  geom_line(aes(group=variable))+
  geom_dl(aes(label=variable),method="last.points")

labeled ggplot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...