I am continueing on my quest of checking off all the conifer species that occur in the Miracle Mile. I recently found some Jeffrey’s Pine (Pinus jeffreyi) on a trail run while on vacation in the San Bernadino mountains East of Los Angeles. This is in an area where there is also Ponderosa Pine (Pinus Ponderosa). Sometimes the species are confused with one another and can even form hybrids making identification difficult. In general the Ponderosa’s are larger trees, but have smaller cones with the pointy end (umbos) of the individual seeds facing outward. The Jeffery’s pine has larger cones with the umbos facing down or inward making them easier to handle without poking yourself. The following are some quick data queries, manipulation and plotting.
Load the libraries.
library(rinat)
library(tidyverse)
Load the trail run data and take a look at the data frame.
TrailRun1 <- read.csv("../../../static/data/TrailRun_JefferyPine.csv")
glimpse(TrailRun1)
## Rows: 2,194
## Columns: 9
## $ timestamp <chr> "2022-04-19 18:45:05", "2022-04-19 18:45:13", "2022-04-…
## $ position_lat <dbl> NA, NA, NA, NA, 34.23880, 34.23873, 34.23869, 34.23868,…
## $ position_long <dbl> NA, NA, NA, NA, -116.8687, -116.8686, -116.8686, -116.8…
## $ distance <int> 0, 67, 72, 74, 76, 76, 80, 84, 87, 89, 91, 94, 98, 100,…
## $ altitude <dbl> NA, 2112.4, 2112.6, 2112.8, 2113.0, 2113.2, 2114.0, 211…
## $ cadence <int> NA, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,…
## $ speed <dbl> NA, 1.74, 1.74, 2.04, 2.04, 2.24, 2.24, 2.44, 2.44, 2.5…
## $ temperature <int> NA, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,…
## $ vertical_speed <dbl> NA, 0.00, 0.00, -0.02, -0.02, -0.02, -0.02, -0.04, -0.0…
Make a quick plot for the run.
TrailRun_plot <- ggplot(TrailRun1, aes(x = position_long, y = position_lat)) +
coord_quickmap() + geom_point() +
xlab("Longitude") + ylab("Latitude")
TrailRun_plot
Use the run data plot to bound the query to iNaturalist.
bounds <- c(34.2, -116.9, 34.25, -116.85)
pineJeff_iNat <- get_inat_obs(query = "Pinus jeffreyi", bounds = bounds, maxresults = 1000)
pinePond_iNat <- get_inat_obs(query = "Pinus ponderosa", bounds = bounds, maxresults = 1000)
Take a quick look at the iNaturalist data frames.
glimpse(pineJeff_iNat)
## Rows: 18
## Columns: 36
## $ scientific_name <chr> "Pinus jeffreyi", "Pinus jeffreyi", "…
## $ datetime <chr> "2022-04-19 12:16:06 -0700", "2022-04…
## $ description <chr> "", "", "", "", "", "", "", "", "", "…
## $ place_guess <chr> "Big Bear, CA 92314, USA", "San Berna…
## $ latitude <dbl> 34.23130, 34.23308, 34.24027, 34.2253…
## $ longitude <dbl> -116.8719, -116.8767, -116.8508, -116…
## $ tag_list <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ common_name <chr> "Jeffrey pine", "Jeffrey pine", "Jeff…
## $ url <chr> "https://www.inaturalist.org/observat…
## $ image_url <chr> "https://inaturalist-open-data.s3.ama…
## $ user_login <chr> "rjcmarkelz", "dingoe", "michaelvanly…
## $ id <int> 112159810, 111583583, 107073178, 8380…
## $ species_guess <chr> "Jeffrey pine", "", "Jeffrey pine", "…
## $ iconic_taxon_name <chr> "Plantae", "Plantae", "Plantae", "Pla…
## $ taxon_id <int> 48463, 48463, 48463, 48463, 48463, 48…
## $ num_identification_agreements <int> 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0…
## $ num_identification_disagreements <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0…
## $ observed_on_string <chr> "2022-04-19 12:16:06", "2022-04-15 14…
## $ observed_on <chr> "2022-04-19", "2022-04-15", "2022-02-…
## $ time_observed_at <chr> "2022-04-19 19:16:06 UTC", "2022-04-1…
## $ time_zone <chr> "Pacific Time (US & Canada)", "Arizon…
## $ positional_accuracy <int> 217, 4, 4, 9, 8, 31, 5, 60, 6, 6, 5, …
## $ public_positional_accuracy <int> 217, 4, 4, 9, 8, 31, 5, 60, 6, 6, 5, …
## $ geoprivacy <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ taxon_geoprivacy <chr> "open", "open", "open", "open", "open…
## $ coordinates_obscured <chr> "false", "false", "false", "false", "…
## $ positioning_method <chr> "gps", "", "", "", "", "", "", "", ""…
## $ positioning_device <chr> "gps", "", "", "", "", "", "", "", ""…
## $ user_id <int> 4268943, 1197171, 1085122, 1059598, 1…
## $ created_at <chr> "2022-04-20 15:41:52 UTC", "2022-04-1…
## $ updated_at <chr> "2022-04-21 15:03:47 UTC", "2022-04-1…
## $ quality_grade <chr> "needs_id", "needs_id", "research", "…
## $ license <chr> "CC-BY-NC", "CC-BY-NC", "", "", "", "…
## $ sound_url <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ oauth_application_id <int> 2, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3…
## $ captive_cultivated <chr> "false", "false", "false", "false", "…
glimpse(pinePond_iNat)
## Rows: 7
## Columns: 36
## $ scientific_name <chr> "Pinus ponderosa", "Pinus ponderosa",…
## $ datetime <chr> "2020-07-06 12:32:31 -0700", "2019-10…
## $ description <lgl> NA, NA, NA, NA, NA, NA, NA
## $ place_guess <chr> "San Bernardino National Forest, Big …
## $ latitude <dbl> 34.23914, 34.21212, 34.22519, 34.2200…
## $ longitude <dbl> -116.8876, -116.8729, -116.8901, -116…
## $ tag_list <lgl> NA, NA, NA, NA, NA, NA, NA
## $ common_name <chr> "Ponderosa Pine", "Ponderosa Pine", "…
## $ url <chr> "https://www.inaturalist.org/observat…
## $ image_url <chr> "https://inaturalist-open-data.s3.ama…
## $ user_login <chr> "jiggajantastic", "josue79", "shaunmi…
## $ id <int> 52182504, 34645641, 33222579, 3309916…
## $ species_guess <chr> "ponderosa pine", "ponderosa pine", "…
## $ iconic_taxon_name <chr> "Plantae", "Plantae", "Plantae", "Pla…
## $ taxon_id <int> 48461, 48461, 48461, 48461, 48461, 48…
## $ num_identification_agreements <int> 1, 2, 0, 0, 0, 0, 0
## $ num_identification_disagreements <int> 0, 0, 0, 0, 0, 0, 0
## $ observed_on_string <chr> "Mon Jul 06 2020 12:32:31 GMT-0700 (P…
## $ observed_on <chr> "2020-07-06", "2019-10-20", "2019-09-…
## $ time_observed_at <chr> "2020-07-06 19:32:31 UTC", "2019-10-2…
## $ time_zone <chr> "Pacific Time (US & Canada)", "Pacifi…
## $ positional_accuracy <int> 53, 5, NA, 3, 5, 5, 10
## $ public_positional_accuracy <int> 53, 5, NA, 3, 5, 5, 10
## $ geoprivacy <lgl> NA, NA, NA, NA, NA, NA, NA
## $ taxon_geoprivacy <chr> "open", "open", "open", "open", "", "…
## $ coordinates_obscured <chr> "false", "false", "false", "false", "…
## $ positioning_method <chr> "", "", "gps", "", "", "", ""
## $ positioning_device <chr> "", "", "gps", "", "", "", ""
## $ user_id <int> 3241047, 2173678, 105431, 105431, 114…
## $ created_at <chr> "2020-07-06 19:34:17 UTC", "2019-10-2…
## $ updated_at <chr> "2021-05-31 02:58:06 UTC", "2019-10-2…
## $ quality_grade <chr> "research", "research", "needs_id", "…
## $ license <chr> "CC-BY-NC", "", "CC-BY-NC", "CC-BY-NC…
## $ sound_url <lgl> NA, NA, NA, NA, NA, NA, NA
## $ oauth_application_id <int> 3, 3, 2, 2, 3, 3, 3
## $ captive_cultivated <chr> "false", "false", "false", "false", "…
Plot all the data on a California map to orient geographically where it is and to check for overlap.
maps::map(database = "state", region = "california")
points(pineJeff_iNat[ , c("longitude", "latitude")], pch = ".", col = "blue", cex = 3)
points(pinePond_iNat[ , c("longitude", "latitude")], pch = ".", col = "red", cex = 3)
points(TrailRun1[ , c("position_long", "position_lat")], pch = ".", col = "black", cex = 3)
Overlay the plots and add research grade symbols (triangle) and needs_id (circle). By default ggplot will have zoomed in on the data given the bounds. We can see that both species occur in the same general area, but there are not any direct overlaps in the research grade observations and my trial running route.
run_plot2 <- ggplot() +
coord_quickmap() +
geom_point(data = TrailRun1, aes(x = position_long, y = position_lat), color = 'black') +
geom_point(data=pinePond_iNat, aes(x = longitude, y = latitude, shape = quality_grade), color = 'red', size = 5) +
geom_point(data=pineJeff_iNat, aes(x = longitude, y = latitude, shape = quality_grade), color = 'blue', size = 5) +
xlab("Longitude") + ylab("Latitude")
run_plot2
We have many more Ponderosa pines near Mount Shasta including one I found on another run. For this iNaturalist observation I also took a photo of the cone. If you take a look at the Ponderosa pine observations you can find mine via my username (rjcmarkelz).
bounds2 <- c(40.194, -124.4323, 42.0021, -120) # Northern California Bounds
PondPineNor_iNat <- get_inat_obs(query = "Pinus ponderosa", bounds = bounds2, maxresults = 100)
PondPineNor_iNat$user_login # Look for rjcmarkelz
## [1] "rjcmarkelz" "gentilcore" "marifer_martinez"
## [4] "westboundwarbler" "screedius" "mwheeler23"
## [7] "christinag309" "dreece11" "chrisbyers"
## [10] "suburbanpoison" "mbworldexplorer" "staceybauer"
## [13] "jeriann86" "sahrajajarmi" "alan_rockefeller"
## [16] "erikoid" "mirandabird" "asabspade"
## [19] "abr" "sphyrapicus" "zrrrk"
## [22] "forummotox" "hwel8533" "hwel8533"
## [25] "trickman" "gentilcore" "maureen-j-jules"
## [28] "mwheeler23" "kyle_achziger" "alan_rockefeller"
## [31] "gentilcore" "gaelabell" "nicholasperlenfein"
## [34] "brennanpopovic" "ventanaphile" "ventanaphile"
## [37] "juliansix6" "bmartinez211" "jacquelinerose"
## [40] "jacquelinerose" "isabella384" "carlina3"
## [43] "jaquiring" "johnreiss" "naturalpriest"
## [46] "caenvsci" "gustafsonja" "jonaleef"
## [49] "wsjaybird" "shinybraids" "highfalutin"
## [52] "socaloutdoors" "michaelkauffmann" "wild_redwolf"
## [55] "jrmorris" "yubabirder" "tuftedtiffmouse"
## [58] "trailhound666" "melodiam" "leptonia"
## [61] "kingratt82" "alan_rockefeller" "alan_rockefeller"
## [64] "alan_rockefeller" "alan_rockefeller" "danielsabohsu"
## [67] "dgreenberger" "mandymushii" "paulbchesler"
## [70] "leptonia" "leptonia" "leptonia"
## [73] "erik-jules" "kylephyte" "chasealexander"
## [76] "sawyer_olson" "s_decuir" "hkibak"
## [79] "s_decuir" "carosisko" "tellittothevoid"
## [82] "jennahb" "tyannasb" "geobob"
## [85] "ericarippe" "jspermenter" "jgunther"
## [88] "chauncey" "sara_dabovich" "mtcreed"
## [91] "mtcreed" "mtcreed" "kathyhill"
## [94] "jrmorris" "rhjackso" "ezradaphic"
## [97] "zanethebrain" "tyannasb" "mavrickfarnam"
## [100] "calibas"
Filter and select the image_url so we can compare the size and physical attributes of the cones.
PondPineNor_iNat %>% filter(user_login == "rjcmarkelz") %>% select(image_url)
## image_url
## 1 https://inaturalist-open-data.s3.amazonaws.com/photos/191166984/medium.jpeg
pineJeff_iNat %>% filter(user_login == "rjcmarkelz") %>% select(image_url)
## image_url
## 1 https://inaturalist-open-data.s3.amazonaws.com/photos/189431793/medium.jpeg
Jeffery’s Pine with the larger (hand for scale) cone with the umbos pointed in:
Ponderosa Pine with the smaller (hand for scale) cone with the umbos pointed out: