I have a dataframe df
(please see reproducible data below) with x
, y
, a
, b
, c
columns. I compute rgb
(red, greeb, blue) color composite:
# compute rgb
df$rgb = rgb(df$a, df$b, df$c)
Then, I want to turn this dataframe
into a rast
using terra
library(terra)
# convert df to a rast
r = rast(df, crs = "WGS84")
When I do this, the rgb
column is turned into NaN
s:
> r
class : SpatRaster
dimensions : 10, 320, 4 (nrow, ncol, nlyr)
resolution : 1, 1 (x, y)
extent : -160, 160, 70, 80 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326)
source(s) : memory
names : a, b, c, rgb
min values : 0.3851323, 0.1583538, 0.03907721, NaN
max values : 0.7313135, 0.4189612, 0.25418453, NaN
Essentially, I want to use the function geom_spatraster
from the package tidyterra
and ggplot2
to visualise the rgb data.
Without tidyterra
I can visualise the data as follows:
library(ggplot2)
library(rnaturalearth)
# get the coastline data as sf
coastlines_sf = ne_coastline(scale = "medium", returnclass = "sf")
ggplot() +
geom_raster(data = df, aes(x, y, fill = rgb)) +
scale_fill_identity() +
geom_sf(data = coastlines_sf)
A tidyterra
equivalent would be something like:
library(tidyterra)
ggplot() +
geom_spatraster(data = r, aes(fill = rgb)) +
scale_fill_identity() +
geom_sf(data = coastlines_sf)
But obviously it does not work (please e.g. see the very south part of south America, where the expected green colour is not plotted)
Reproducible data::
df <- structure(list(x = c(-74.5, -74.5, -74.5, -73.5, -73.5, -73.5,
-72.5, -72.5, -71.5, -71.5, -71.5, -71.5, -71.5, -71.5, -71.5,
-70.5, -70.5, -70.5, -70.5, -70.5, -70.5, -70.5, -70.5, -70.5,
-70.5, -70.5, -70.5, -70.5, -69.5, -69.5, -69.5, -69.5, -69.5,
-69.5, -69.5, -69.5, -69.5, -69.5, -69.5, -69.5, -69.5, -69.5,
-69.5, -68.5, -68.5, -68.5, -68.5, -68.5, -68.5, -68.5, -68.5,
-68.5, -68.5, -68.5, -67.5, -67.5, -67.5, -67.5, -67.5, -67.5,
-67.5, -67.5, -67.5, -67.5, -66.5, -66.5, -66.5, -66.5, -66.5,
-66.5, -65.5, -65.5, -65.5, -65.5, -64.5, -63.5, 145.5, 146.5,
146.5, 147.5, 147.5, 169.5, 170.5, 170.5, 172.5, 172.5, 173.5,
173.5, 175.5), y = c(-50.5, -49.5, -46.5, -45.5, -41.5, -40.5,
-51.5, -40.5, -52.5, -51.5, -50.5, -49.5, -48.5, -45.5, -44.5,
-52.5, -51.5, -50.5, -49.5, -48.5, -47.5, -46.5, -45.5, -44.5,
-43.5, -42.5, -41.5, -40.5, -55.5, -53.5, -52.5, -51.5, -50.5,
-49.5, -48.5, -47.5, -46.5, -45.5, -44.5, -43.5, -42.5, -41.5,
-40.5, -53.5, -49.5, -48.5, -47.5, -46.5, -45.5, -44.5, -43.5,
-42.5, -41.5, -40.5, -54.5, -48.5, -47.5, -46.5, -45.5, -44.5,
-43.5, -42.5, -41.5, -40.5, -47.5, -44.5, -43.5, -42.5, -41.5,
-40.5, -43.5, -42.5, -41.5, -40.5, -40.5, -40.5, -41.5, -42.5,
-41.5, -42.5, -41.5, -45.5, -45.5, -44.5, -43.5, -41.5, -42.5,
-41.5, -40.5), a = c(0.00960646095846934, 0.0107211537770858,
0.0021450412691773, 0.0045505840420013, 0, 0, 0.0178641663901207,
0.000114664688300056, 0.00307793920859317, 0.0397662643009339,
0.0604302099149969, 0.0489996355067338, 0.0761637028942619, 0.0721391994373738,
0.0286955884419135, 0.0132820025262969, 0.0239635116965841, 0.0321472332160114,
0.0297445886688907, 0.0286537513835504, 0.0350160311966702, 0.0266880069207789,
0.0246363370053615, 0.0196110963394959, 0.0192277974257839, 0.00443219128797979,
0.00905912420084446, 0.00108861789789237, 0.00545657352102614,
0.00277087980897986, 0.0048581585653791, 0.0111483654900654,
0.0173443447511208, 0.0191704395787758, 0.0287344700495196, 0.035562350382349,
0.0162432464057994, 0.0152193319873854, 0.0233689119154181, 0.015818007952541,
0.0138323743513157, 0.00995716868729754, 0.0060245918334208,
0.00126566408878553, 0.0121859145176333, 0.0160686675462497,
0.0199868442198467, 0.00571838395930305, 0.00899896782857034,
0.0122839878433772, 0.00812199685920614, 0.0236680200661936,
0.0164528502963111, 0.00401833465388731, 0.0252041777182223,
0.00474040271660494, 0.00529145334170783, 0.00143754732859506,
0.00306248020407983, 0.0047192270320121, 0.00284510865796966,
0.00654780874247308, 0.00200161475298119, 0.000983630507466302,
0.00414849014194222, 0.00228390751366616, 0.00101576169552506,
0.00054963121693693, 0.00063555535523403, 0, 0.00042539225277756,
6.45333309886086e-05, 9.4029799969462e-05, 0, 0, 7.14516962134147e-06,
0, 0, 0, 0, 0, 0.00957735912739627, 0.000458637950700158, 0.00184617106824235,
0, 0.000642432395196541, 0.00039151279290547, 0.000341094431495925,
0), b = c(0.726214797184461, 0.71164224353343, 0.451275516898288,
0.394425878075392, 0.739653175101045, 0.789679333377203, 0.54513343050909,
0.748096411499116, 0.637758148362954, 0.804483227899012, 0.815882186402205,
0.845419576781181, 0.785035127263261, 0.650754524321527, 0.565620243042535,
0.747242358064224, 0.901570593192835, 0.876864014581682, 0.875748761130915,
0.875441727867402, 0.850544308509126, 0.875610142568506, 0.778353470331944,
0.66290601970565, 0.643516154686927, 0.652461173409377, 0.641005740998037,
0.673939925204614, 0.579626516309421, 0.745095570147862, 0.875498117933161,
0.90645794278283, 0.900246890214777, 0.917139905866649, 0.88258894208252,
0.875682104646359, 0.904559344914523, 0.869277878116666, 0.82815980916799,
0.789286961613949, 0.793714463229649, 0.798340899287069, 0.795265039070927,
0.809122812256599, 0.936535149104964, 0.913385909113815, 0.913860352861773,
0.942470665576281, 0.914731915186546, 0.910895562157346, 0.908557068434931,
0.890082095057589, 0.898121177345363, 0.90117499876107, 0.743740425652289,
0.947013840601633, 0.951526480785598, 0.925388777233251, 0.939990726262484,
0.925945462742375, 0.915508745124089, 0.916192056973718, 0.926008092761408,
0.912451960219619, 0.954478263060087, 0.949854335448342, 0.923279988118492,
0.922573791351208, 0.935874036776427, 0.926298552448805, 0.948494363610902,
0.937484856878812, 0.929022357932769, 0.939701487351031, 0.923342876011735,
0.96264144140606, 0.827523195314497, 0.762759732100396, 0.872746242783302,
0.919113271004337, 0.943498218180097, 0.672071125498697, 0.853102387466382,
0.595971968865642, 0.805944307217466, 0.73953470776106, 0.680611436206279,
0.72312882725833, 0.777090811680429), c = c(0.26417874185707,
0.277636602689484, 0.546579441832535, 0.601023537882607, 0.260346824898955,
0.210320666622797, 0.437002403100789, 0.251788923812584, 0.359163912428452,
0.155750507800054, 0.123687603682798, 0.105580787712085, 0.138801169842477,
0.277106276241099, 0.405684168515551, 0.23947563940948, 0.0744658951105806,
0.090988752202307, 0.094506650200194, 0.0959045207490474, 0.114439660294203,
0.0977018505107156, 0.197010192662695, 0.317482883954854, 0.337256047887289,
0.343106635302644, 0.349935134801119, 0.324971456897494, 0.414916910169553,
0.252133550043159, 0.11964372350146, 0.0823936917271048, 0.0824087650341023,
0.0636896545545757, 0.0886765878679606, 0.0887555449712918, 0.0791974086796774,
0.115502789895948, 0.148471278916592, 0.19489503043351, 0.192453162419035,
0.191701932025634, 0.198710369095652, 0.189611523654616, 0.0512789363774025,
0.0705454233399353, 0.0661528029183804, 0.0518109504644155, 0.0762691169848838,
0.0768204499992763, 0.0833209347058624, 0.0862498848762179, 0.0854259723583258,
0.0948066665850425, 0.231055396629489, 0.0482457566817616, 0.0431820658726939,
0.073173675438154, 0.0569467935334359, 0.0693353102256132, 0.0816461462179411,
0.0772601342838093, 0.0719902924856103, 0.0865644092729144, 0.0413732467979708,
0.0478617570379917, 0.0757042501859831, 0.0768765774318549, 0.0634904078683389,
0.073701447551195, 0.0510802441363202, 0.0624506097901988, 0.0708836122672612,
0.0602985126489692, 0.0766571239882651, 0.0373514134243189, 0.172476804685503,
0.237240267899604, 0.127253757216698, 0.080886728995663, 0.0565017818199034,
0.318351515373907, 0.146438974582918, 0.402181860066115, 0.194055692782534,
0.259822859843743, 0.318997051000816, 0.276530078310174, 0.222909188319571
)), row.names = c(NA, -89L), class = "data.frame")
For plotting RGB rasters you have
geom_spatraster_rgb()
, that have parametersr,g,b
for settingthe position of each channel andmax_col_value
that set the range of the values on which the RGB space is represented (in your example I think is 1 but it can be 255 in some cases). So you just need to setgeom_spatraster_rgb(data = r, r =1, g = 2, b = 3, max_col_value = 1)
and you don't even need to create thergb
column. See a reprex:Created on 2023-11-07 with reprex v2.0.2