lingtypology
and other
packagesdplyr
and pipe |>
It is possible to use dplyr
functions and pipes with lingtypology
. It is widely used,
so I will give some examples, how to use it with
thelingtypology
package. Using query “list of languages
csv” I found Vincent Garnier’s languages-list
repository. Let’s download and map all the languages from that set.
First download the data:
As we see, some values of the Language.name
variable
contain more than one language name. Some of the names probably have
different names in our database. Imagine that we want to map all
languages from Africa. So that the following examples work correctly,
use library(dplyr)
.
library(dplyr)
new_data |>
mutate(Language.name = gsub(pattern = " ", replacement = "", Language.name)) |>
filter(is.glottolog(Language.name) == TRUE) |>
filter(area.lang(Language.name) == "Africa") |>
select(Language.name) |>
map.feature()
We start with a dataframe, here a new_data
. First we
remove spaces at the end of each string. Then we check, whether the
language names are in the glottolog database. Then we select only rows
that contain languages of Africa. Then we select the
Language.name
variable. And the last line maps all selected
languages.
By default, the values that came from the pipe are treated as the first argument of a function. But when there are some additional arguments, underline sign specify what exact position should be piped to. Let’s produce the same map with a minimap.
leaflet
, leaflet.extras
,
mapview
, mapedit
There is also a possibility to use lingtypology
with
other leaflet
functions (thanks to Niko
Partanen for the idea):
##
## Attaching package: 'leaflet'
## The following object is masked from 'package:lingtypology':
##
## providers
If you add leaflet
arguments befor
map.feature
function, you need to use argument
pipe.data = _
:
leaflet() %>%
fitBounds(0, 40, 10, 50) |>
addPopups(2, 48, "Great day!") |>
map.feature(c("French", "Occitan"), pipe.data = _)
The other usage of this pipe.data
argument is to put
there a variable with a leaflet
object:
m <- leaflet() |>
fitBounds(0, 40, 10, 50) |>
addPopups(2, 48, "Great day!")
map.feature(c("French", "Occitan"), pipe.data = m)
If you want to define tiles in leaflet
part, you need to
change tile argument in map.feature
function, because the
default value for the tile
argument is
“OpenStreetMap.Mapnik”.
leaflet() |>
addProviderTiles("Stamen.TonerLite") |>
fitBounds(0, 40, 10, 50) |>
addPopups(2, 48, "Great day!") |>
map.feature(c("French", "Occitan"), pipe.data = _, tile = "none")
It is also possible to use some tools provided by leaflet.extras
package:
map.feature(c("French", "Occitan")) |>
leaflet.extras::addDrawToolbar() |>
leaflet.extras::addStyleEditor()
Also there is a nice package mapedit
that provide a
possibility of creating and editing of leaflet objects by hand:
mapview
The leafsync
package provides a possibility to create a multiple maps in a grid
and even synchronise them. There are two functions for that:
latticeview()
and sync()
. Facetisation is a
really powerfull tool (look for facet_grid()
and
facet_wrap()
functions from ggplot2
).
lingtypology
doesn’t provide a facetisation itself, but the
facet
argument of the map.feature()
function
create a list of maps based on this variable. The result of the work of
this function then is changed: instead of creating a map in Viewer pane
it will return a list that could be used in latticeview()
and sync()
functions from the leafsync
package.
faceted <- map.feature(circassian$language,
latitude = circassian$latitude,
longitude = circassian$longitude,
features = circassian$dialect,
facet = circassian$language)
library(leafsync)
sync(faceted, no.initial.sync = FALSE)
As you can see we provided a circassian$language
to the
facet
argument, so it returned a list of two maps that
stored in faceted
variable.
It is also possible to combine any maps that were created, just store
them in a variable, and combine them in latticeview()
and
sync()
functions
overpass
This section is inspired by talk with Niko Partanen and his gist. Overpass is a packge with tools to work with the OpenStreetMap (OSM) Overpass API. Explore simple Overpass queries with overpass turbo. Imagine that we need to get all settlements from Ingushetia, Daghestan and Chechnya. So, first, load a library:
Create a query:
settlements <- 'area[name~"Дагестан|Ингушетия|Чечня"];
(node["place"~"city|village|town|hamlet"](area););
out;'
Pass the query to overpass_query()
function and change
the input result to dataframe:
query_result <- overpass_query(settlements)
settlement_data <- as.data.frame(query_result[, c("id", "lon", "lat", "name")])
Some values could be NA
, so I profer clean it with
complete.cases()
function:
On the last step, I will use a “fake” language argument to avoid the creation of some Glottolog links:
map.feature(language = "fake",
latitude = settlement_data$lat,
longitude = settlement_data$lon,
label = settlement_data$name)
Results are not ideal: there are some villages Дагестанская and
Красный Дагестан in Adygeya and Krasnodarskiy district, but the most
points are correct. It is also possible to get all data from some
polygone created with mapedit
(see previous section).
rmarkdown
This section is inspired by talk with Niko Partanen. It is possible
to create an atlas website using lingtypology
and rmarkdown
packages. The function atlas.database()
creates a folder in
the working directory that contains an rmarkdown
template
for a web-site.
First, lets create a dataframe
with some data.
## Don't forget to cite the source (modify in case of using individual chapters):
##
## Dryer, Matthew S. & Haspelmath, Martin (eds.) 2013. The World Atlas of Language Structures Online. Leipzig: Max Planck Institute for Evolutionary Anthropology.
## (Available online at https://wals.info/, Accessed on 2024-03-13.)
##
## @book{wals,
## address = {Leipzig},
## editor = {Matthew S. Dryer and Martin Haspelmath},
## publisher = {Max Planck Institute for Evolutionary Anthropology},
## title = {WALS Online},
## url = {https://wals.info/},
## year = {2013}
## }
Second we can create a website using atlas.database()
function:
languages
argument is a language listfeatures
argument is a data.frame with corresponding
featureslatitude
and longitude
arguments are
optionalatlas.database(languages = df$language,
features = df[,c(4:5)],
latitude = df$latitude,
longitude = df$longitude,
atlas.name = "Some WALS features",
author = "Author Name")
We can see that this function creates a subfolder with following files:
## [1] "_site.yml" "1._1a.Rmd" "2._20a.Rmd" "database.csv" "footer.html"
## [6] "index.Rmd"
The last step is to run a command:
Then the atlas website will be created (here is a result). If you want to change something in the website, just change some files:
.Rmd
filermarkdown::render_site("./atlas_Some_WALS_features/")
command.sp
and
rgdal
.kml file is a common file type for geospatial data. This kind of
files are used in Google Earth, Gabmap (a web application that
visualizes dialect variations) and others. In order to produce a .kml
file you need to have a dataset with coordinates such as
circassian
: