我对以下情节中的图例有几个问题:
似乎我需要使用scale_manual
和guide_legend
选项,但我的所有尝试都失败了。
以下是创建绘图的代码。 plotDumping
是绘制图表的函数,updateData
为图表生成数据框,并且' updateLabels'为情节生成脚注。
library(ggplot2)
library(grid)
library(gridExtra)
library(scales)
max_waste_volume <- 2000
Illegal_dumping_fine_P <- 300000
Illigal_landfilling_fine_P1 <- 500000
Fine_probability_k <- 0.5
Official_tax_Ta <- 600
# mwv = max_waste_volume
# P = Illegal_dumping_fine_P
# P1 = Illigal_landfilling_fine_P1
# k = Fine_probability_k
# Ta = Official_tax_Ta
updateData <- function(mwv, k, P1, P, Ta){
# creates and(or) updates global data frame to provide data for the plot
new_data <<- NULL
new_data <<- as.data.frame(0:mwv)
names(new_data) <<- 'V'
new_data$IlD <<- k*P1/new_data$V
new_data$IlD_fill <<- new_data$IlD
new_data$IlD_fill[new_data$IlD_fill > Ta] <<- NA # we don't want ribbon to
new_data$IlL <<- Ta-k*P/new_data$V
}
updateLabels <- function(k, P1, P, Ta){
### creates footnote caption for the plot
prob <- paste('Fining probability = ', k, sep = '')
landfilling_fine <- paste('Illegal landfilling fine = ', P1, sep = '')
dumping_fine <- paste('Illegal dumping fine = ', P, sep = '')
tax <- paste('Official tax = ', Ta, sep = '')
note <<- paste(prob, landfilling_fine, sep = '; ')
note <<- paste(note, dumping_fine, sep = '; ')
note <<- paste(note, tax, sep = '; ')
note
}
plotDumping <- function(mwv,
P,
P1,
k,
Ta){
### this function draws the plot
# initialise plot data
updateData(mwv, k, P1, P, Ta)
updateLabels(k, P1, P, Ta)
# draw the plot
profit <- ggplot(data=new_data, aes(x = new_data$V)) +
geom_ribbon(show_guide = T, alpha = 0.25, ymax = Ta,
aes(ymin = new_data$IlD_fill,
fill = "Illegal landfill owner's\nprofitable ratio\n")) +
geom_ribbon(show_guide = F, alpha = 0.25, ymin = 0,
aes(ymax = new_data$IlL,
fill = "Waste owner's\nprofitable ratio")) +
geom_line(data=new_data,
aes(y = new_data$IlD, col = "Illegal landfill owner's\nprofitable ratio\n"),
size = 1,
linetype = 4) +
geom_line(data=new_data,
aes(y = new_data$IlL, col = "Waste owner's\nprofitable ratio"),
size = 1,
linetype = 5) +
geom_line(y = Ta,
aes(col = "Official tax"),
size = 1.5,
linetype = 1)+
xlim(c(0, max(new_data$V)))+
ylim(c(0, Ta*1.5))+
theme(axis.text.x = element_text(angle=0, hjust = 0),
axis.title = element_text(face = 'bold', size = 14),
title = element_text(face = 'bold', size = 16),
legend.position = 'right',
legend.title = element_blank(),
legend.text = element_text(size = 12),
legend.key.width = unit(1, 'cm'))+
labs(title="Profitable ratio between the volume \nof illegally disposed waste \nand costs of illegal waste disposure",
x="Waste volume, cubic meters",
y="Cost per cubic meter, RUB")
# add a footnote about paramaters used for the current plot
profit <- arrangeGrob(profit, sub = textGrob(note,
x = 0,
hjust = -0.1,
vjust=0.1,
gp = gpar(fontface = "italic", fontsize = 12)))
# show plot
print(profit)
}
# draw the plot
plotDumping(max_waste_volume,
Illegal_dumping_fine_P,
Illigal_landfilling_fine_P1,
Fine_probability_k,
Official_tax_Ta)
答案 0 :(得分:3)
在这种情况下,一种解决方法是为geom_ribbon()
添加Official tax
(使用值Ta
作为ymax
和ymin
)。这将使两个图例具有相同的级别,并且它们将连接在一起。然后使用scale_fill_manual()
,您可以将Official tax
的填充值设置为NA,然后在此级别填充的图例中将填充为背景。
+ geom_ribbon(show_guide = F, alpha = 0.25, ymin = Ta,ymax=Ta,
aes(fill = "Official tax"))
+ scale_fill_manual(values=c("#F8766D",NA,"#00BFC4"))
P.S。请勿在{{1}} $
个aes()
函数内使用ggplot()
(仅使用列名称)。正如您已经写过data=new_data
,aes()
中的所有变量都在此数据框中查找。
答案 1 :(得分:2)
如果你将线型添加到aes
函数中,你可以使用你的版本来获得正确的线型。但是,您的代码变得更加繁琐。在调用ggplot
之前,请考虑重新整理数据。那么你根本不必担心这个传说。
# reshape data ...
new_data$Ta <- Ta
new_data$zero <- 0
require(reshape2)
dta <- melt(new_data, id.vars="V", measure.vars=c("IlD", "IlL", "Ta"))
dta.lower <- melt(new_data, id.vars="V", measure.vars=c("IlD_fill", "zero", "Ta"))
dta.upper <- melt(new_data, id.vars="V", measure.vars=c("Ta", "IlL", "Ta"))
dta <- cbind(dta, lower=dta.lower$value, upper=dta.upper$value)
dta$name <- factor(NA, levels=c("Illegal landfill owner's\nprofitable ratio\n",
"Waste owner's\nprofitable ratio",
"Official tax"))
dta$name[dta$variable=="IlD"] <- "Illegal landfill owner's\nprofitable ratio\n"
dta$name[dta$variable=="IlL"] <- "Waste owner's\nprofitable ratio"
dta$name[dta$variable=="Ta"] <- "Official tax"
现在,绘图命令变得更容易,更透明:
ggplot(dta, aes(x=V, y=value, ymin=lower, ymax=upper,
color=name, fill=name, linetype=name)) +
geom_line(size=1.2) + ylim(c(0, Ta*1.5)) +
geom_ribbon(alpha=.25, linetype=0) +
theme(axis.text.x = element_text(angle=0, hjust = 0),
axis.title = element_text(face = 'bold', size = 14),
title = element_text(face = 'bold', size = 16),
legend.position = 'right',
legend.title = element_blank(),
legend.text = element_text(size = 12),
legend.key.width = unit(2, 'cm'))+
scale_linetype_manual(values=c(4, 5, 1)) +
labs(title="Profitable ratio between the volume \nof illegally disposed waste \nand costs of illegal waste disposure",
x="Waste volume, cubic meters",
y="Cost per cubic meter, RUB")