我有以下数据框:
df
zone X Y Value
1 604000 2673000 522
1 612000 2643000 524
. . . .
. . . .
615 604000 2673000 698
实际上我有615个区域,X和Y是Lambert坐标,Value是下雨。 我的区域代表法国,我试图绘制它们:
mi <- 300
ma <- 1900
df$val <- cut(df$Sim, breaks=seq(mi,ma,100),
labels = paste( "(", format(seq(mi,ma,100)[1:(length(seq(mi,ma,100))-1)]),
", ", format(seq(mi,ma,100)[-1]), "]", sep = ""))
breaks <- unique(bincol(df$Sim,"green","yellow","red"))
breaks <- breaks[order(unique(df$val))]
p <- ggplot(data =df, aes(x=X, y=Y))
p <- (p
+ theme_bw()
+ coord_equal()
+ geom_tile(aes(fill=val))
+ scale_colour_manual("mm", values = breaks)
+ geom_path(data = polfrance, colour = 'black',
aes(x = long, y = lat, group = group))
+ geom_path(data = sympzones, colour = 'grey40',
aes(x = long, y = lat, group = group))
)
p <- (p + scale_y_continuous(limits=c(1580000,2730000),
breaks=seq(1600000,2700000, 200000),
labels= seq(1600,2700,200), expand=c(0,0))
+ scale_x_continuous(limits=c(0,1250000),
breaks= seq(0,1250000, 400000),
labels= seq(0,1250, 400), expand=c(0,0))
+ xlab("X Lambert [km]")
+ ylab("Y Lambert [km]")
)
我使用sympzones和polfrance绘制区域的轮廓。
和
bincol <- function(x,low,medium,high) {
breaks <- function(x) pretty(range(x), n = nclass.Sturges(x), min.n = 1)
colfunc <- colorRampPalette(c(low, medium, high))
binned <- cut(x,breaks(x))
res <- colfunc(length(unique(binned)))[as.integer(binned)]
names(res) <- as.character(binned)
res
}
值从300到1900,这是我获得的:
我遇到了问题:
我无法更改图例,这是geom_file中的图例,并未考虑scale_colour_manual。所以这不是升序,不是好标题(我想要“mm”)而不是好颜色。
我不知道是否真的很清楚......有人能帮助我吗?
编辑:我从中获取灵感:easiest way to discretize continuous scales for ggplot2 color scales?
答案 0 :(得分:9)
您有两个比例,因为您同时使用fill
和color
美学,并且您正在使用不同的变量(一个离散,一个连续)。你想要做的是只使用一个变量来填充。
此外,你的标签都搞砸了,因为你把它们作为字符传递,然后ggplot会在词汇上排序(所以“10”在“2”之前出现)。
这是一个绕过这两个问题的解决方案。我们保留factor
输出的原始cut
格式,该格式将以正确的顺序标记,我们只使用fill
美学。另请注意,通过创建颜色并使用级别标记它们并使用scale_fill_manual
来设置比例更简单:
library(ggplot2)
df <- expand.grid(1:10, 1:10) # make up data
df <- transform(df, z=Var1 * Var2) # make up data
df <- transform(df, z.cut=cut(z, 10)) # bin data
colors <- colorRampPalette(c("blue", "yellow", "red"))(length(levels(df$z.cut)))
ggplot(df, aes(x=Var1, y=Var2, fill=z.cut)) +
geom_tile() +
scale_fill_manual(values=setNames(colors, levels(df$z.cut)))