我有由(x,y,z)值组成的数据,我想将其绘制为ggplot2中的热图。但是,这些点的间距不均匀(即x和y数据点不能很好地落在规则网格上),这会阻止数据正常显示。我发现this帖子涉及一个类似的问题,他们在其中建议使用interp
函数将数据插值到均匀间隔的网格。我在下面提供了一些示例代码来完成此任务
library(akima)
data <- data.frame("x" = c(1, 3, 5), "y" = c(-1, 2, 8), "z" = c(5, 1, 2))
resolution <- 0.1
a <- interp(x=data$x, y=data$y, z=data$z,
xo=seq(min(data$x),max(data$x),by=resolution),
yo=seq(min(data$y),max(data$y),by=resolution), duplicate="mean")
结果变量a
可以使用image
函数自动显示,但是我想使用ggplot2。我无法理解a
的结构-它似乎是列表的列表,但是每个列表的长度都不同,我不确定如何将其转换为适合ggplot2的形式。我在interp
的文档中找不到答案。有人可以解释如何使用ggplot2将a
重铸吗?
答案 0 :(得分:1)
a$y
包含x坐标
a$z
包含y坐标
library(akima)
library(data.table)
data <- data.frame("x" = c(1,3,5,7), "y" = c(-1,2,8,5), "z" = c(5,1,2,7))
resolution <- 0.1
a <- interp(x=data$x, y=data$y, z=data$z,
xo=seq(min(data$x),max(data$x),by=resolution),
yo=seq(min(data$y),max(data$y),by=resolution), duplicate="mean")
x.coordinate <- a$x
y.coordinate <- a$y
energy.table <- as.data.frame(a$z)
names(energy.table) <- y.coordinate
energy.table[is.na(energy.table)] <- 0
energy.table$x <- x.coordinate
longenergy <- melt(as.data.table(energy.table),id="x")
ggheat <- ggplot(longenergy,aes(x=variable,y=x, fill=value)) +
geom_tile() +
theme(axis.text.x=element_blank(),axis.text.y=element_blank()) +
xlab("y") + ylab("x")
ggheat
包含实际矩阵
# \sf close_event
CREATE OR REPLACE FUNCTION public.close(input text)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
_event_idnumber INTEGER;
BEGIN
FOR _event_idnumber IN
SELECT id FROM public.alerts WHERE data ->> 'field_name' = input
LOOP
INSERT INTO public.comments ( created_date, content, alert_id, user_id) VALUES (current_timestamp, 'text1 text', _event_idnumber, 1);
INSERT INTO public.comments ( created_date, content, alert_id, user_id) VALUES (current_timestamp, 'text2 text.', _event_idnumber, 1);
INSERT INTO public.analysis ( alert_id, created_date, last_updated, notes) VALUES (_event_idnumber, current_timestamp, current_timestamp, 'text3 text');
UPDATE public.alerts SET status='DONE', outcome='completed', last_updated=current_timestamp, assigned_user_id=1 WHERE id = _event_idnumber;
UPDATE public.alerts SET data = jsonb_set(data, '{other_field}'::text[], input::jsonb) WHERE id = _event_idnumber;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
END;
$function$;
上面的代码产生下面的图像。然后,您可以使用ggplot固定颜色,标签,标题,...