在ggplot2中绘制热图而没有均匀间隔的点

时间:2019-12-18 16:43:24

标签: r ggplot2

我有由(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重铸吗?

1 个答案:

答案 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固定颜色,标签,标题,...

theImage

相关问题