Choropleth maps
Summary: This example shows how to create choropleth map in F#.
Let's first create some data for the purpose of creating example charts:
open Plotly.NET
// Pure alcohol consumption among adults (age 15+) in 2010
let locations, z =
[ ("Belarus", 17.5)
("Moldova", 16.8)
("Lithuania", 15.4)
("Russia", 15.1)
("Romania", 14.4)
("Ukraine", 13.9)
("Andorra", 13.8)
("Hungary", 13.3)
("Czech Republic", 13.)
("Slovakia", 13.)
("Portugal", 12.9)
("Serbia", 12.6)
("Grenada", 12.5)
("Poland", 12.5)
("Latvia", 12.3)
("Finland", 12.3)
("South Korea", 12.3)
("France", 12.2)
("Australia", 12.2)
("Croatia", 12.2)
("Ireland", 11.9)
("Luxembourg", 11.9)
("Germany", 11.8)
("Slovenia", 11.6)
("United Kingdom", 11.6)
("Denmark", 11.4)
("Bulgaria", 11.4)
("Spain", 11.2)
("Belgium", 11.)
("South Africa", 11.)
("New Zealand", 10.9)
("Gabon", 10.9)
("Namibia", 10.8)
("Switzerland", 10.7)
("Saint Lucia", 10.4)
("Austria", 10.3)
("Estonia", 10.3)
("Greece", 10.3)
("Kazakhstan", 10.3)
("Canada", 10.2)
("Nigeria", 10.1)
("Netherlands", 9.9)
("Uganda", 9.8)
("Rwanda", 9.8)
("Chile", 9.6)
("Argentina", 9.3)
("Burundi", 9.3)
("United States", 9.2)
("Cyprus", 9.2)
("Sweden", 9.2)
("Venezuela", 8.9)
("Paraguay", 8.8)
("Brazil", 8.7)
("Sierra Leone", 8.7)
("Montenegro", 8.7)
("Belize", 8.5)
("Cameroon", 8.4)
("Botswana", 8.4)
("Saint Kitts and Nevis", 8.2)
("Guyana", 8.1)
("Peru", 8.1)
("Panama", 8.)
("Niue", 8.)
("Palau", 7.9)
("Norway", 7.7)
("Tanzania", 7.7)
("Georgia", 7.7)
("Uruguay", 7.6)
("Angola", 7.5)
("Laos", 7.3)
("Japan", 7.2)
("Mexico", 7.2)
("Ecuador", 7.2)
("Dominica", 7.1)
("Iceland", 7.1)
("Thailand", 7.1)
("Bosnia and Herzegovina", 7.1)
("Sao Tome and Principe", 7.1)
("Malta", 7.)
("Albania", 7.)
("Bahamas", 6.9)
("Dominican Republic", 6.9)
("Mongolia", 6.9)
("Cape Verde", 6.9)
("Barbados", 6.8)
("Burkina Faso", 6.8)
("Italy", 6.7)
("Trinidad and Tobago", 6.7)
("China", 6.7)
("Macedonia", 6.7)
("Saint Vincent and the Grenadines", 6.6)
("Equatorial Guinea", 6.6)
("Suriname", 6.6)
("Vietnam", 6.6)
("Lesotho", 6.5)
("Haiti", 6.4)
("Cook Islands", 6.4)
("Colombia", 6.2)
("Ivory Coast", 6.)
("Bolivia", 5.9)
("Swaziland", 5.7)
("Zimbabwe", 5.7)
("Seychelles", 5.6)
("Cambodia", 5.5)
("Puerto Rico", 5.4)
("Netherlands Antilles", 5.4)
("Philippines", 5.4)
("Costa Rica", 5.4)
("Armenia", 5.3)
("Cuba", 5.2)
("Nicaragua", 5.)
("Jamaica", 4.9)
("Ghana", 4.8)
("Liberia", 4.7)
("Uzbekistan", 4.6)
("Chad", 4.4)
("United Arab Emirates", 4.3)
("Kyrgyzstan", 4.3)
("India", 4.3)
("Turkmenistan", 4.3)
("Kenya", 4.3)
("Ethiopia", 4.2)
("Honduras", 4.)
("Guinea-Bissau", 4.)
("Zambia", 4.)
("Republic of the Congo", 3.9)
("Guatemala", 3.8)
("Central African Republic", 3.8)
("North Korea", 3.7)
("Sri Lanka", 3.7)
("Mauritius", 3.6)
("Samoa", 3.6)
("Democratic Republic of the Congo", 3.6)
("Nauru", 3.5)
("Gambia", 3.4)
("Federated States of Micronesia", 3.3)
("El Salvador", 3.2)
("Fiji", 3.)
("Papua New Guinea", 3.)
("Kiribati", 3.)
("Tajikistan", 2.8)
("Israel", 2.8)
("Sudan", 2.7)
("Malawi", 2.5)
("Lebanon", 2.4)
("Azerbaijan", 2.3)
("Mozambique", 2.3)
("Togo", 2.3)
("Nepal", 2.2)
("Brunei", 2.1)
("Benin", 2.1)
("Singapore", 2.)
("Turkey", 2.)
("Madagascar", 1.8)
("Solomon Islands", 1.7)
("Tonga", 1.6)
("Tunisia", 1.5)
("Tuvalu", 1.5)
("Qatar", 1.5)
("Vanuatu", 1.4)
("Djibouti", 1.3)
("Malaysia", 1.3)
("Syria", 1.2)
("Maldives", 1.2)
("Mali", 1.1)
("Eritrea", 1.1)
("Algeria", 1.)
("Iran", 1.)
("Oman", 0.9)
("Brunei", 0.9)
("Morocco", 0.9)
("Jordan", 0.7)
("Bhutan", 0.7)
("Guinea", 0.7)
("Burma", 0.7)
("Afghanistan", 0.7)
("Senegal", 0.6)
("Indonesia", 0.6)
("Timor-Leste", 0.6)
("Iraq", 0.5)
("Somalia", 0.5)
("Egypt", 0.4)
("Niger", 0.3)
("Yemen", 0.3)
("Comoros", 0.2)
("Saudi Arabia", 0.2)
("Bangladesh", 0.2)
("Kuwait", 0.1)
("Libya", 0.1)
("Mauritania", 0.1)
("Pakistan", 0.1) ]
|> List.unzip
Choropleth Maps display divided geographical areas or regions that are coloured, shaded or patterned in relation to a data variable. This provides a way to visualise values over a geographical area, which can show variation or patterns across the displayed location.
let choroplethMap1 =
Chart.ChoroplethMap(locations = locations, z = z, LocationMode = StyleParam.LocationFormat.CountryNames)
Map styling
you can access various map styles via Chart.withGeoStyle, such as the projection type, lake/ocean color, and so on.
open Plotly.NET.LayoutObjects
let choroplethMap2 =
Chart.ChoroplethMap(locations = locations, z = z, LocationMode = StyleParam.LocationFormat.CountryNames)
|> Chart.withGeoStyle (
Projection = GeoProjection.init (projectionType = StyleParam.GeoProjectionType.Mollweide),
ShowLakes = true,
ShowOcean = true,
OceanColor = Color.fromString "lightblue",
ShowRivers = true
)
|> Chart.withColorBarStyle (TitleText = "Alcohol consumption[l/y]", Len = 0.5)
Using GeoJSON
GeoJSON is an open standard format designed for representing simple geographical features, along with their non-spatial attributes.
GeoJSON, or at least the type of GeoJSON accepted by plotly.js are FeatureCollections. A feature has for example the geometry field, which defines e.g. the coordinates of it (think for example the coordinates of a polygon on the map)
and the properties field, a key-value pair of properties of the feature.
If you want to use GeoJSON with Plotly.NET (or any plotly flavor really), you have to know the property of the feature you are mapping your data to. In the following example, this is simply the id of a feature, but you can access any property by property.key.
Consider the following GeoJSON:
// we are using the awesome FSharp.Data project here to perform a http request
open Newtonsoft.Json
open System.IO
let geoJson =
(__SOURCE_DIRECTORY__ + "/../data/geojson-counties-fips.json")
|> File.ReadAllText
|> JsonConvert.DeserializeObject // the easiest way to use the GeoJSON object is deserializing the JSON string.
It looks like this:
|
It basically contains all US counties as polygons on the map. Note that the id property corresponds to the fips code.
To visualize some data using these counties as locations on a choropleth map, we need some example data:
// we use the awesome Deedle data frame library to parse and extract our location and z data
open Deedle
let data =
__SOURCE_DIRECTORY__ + "/../data/fips-unemp-16.csv"
|> fun csv -> Frame.ReadCsv(csv, true, separators = ",", schema = "fips=string,unemp=float")
The data looks like this:
data.Print()
|
As the data contains the fips code and associated unemployment data, we can use the fips codes as locations and the unemployment as z data:
let locationsGeoJSON: string[] =
data |> Frame.getCol "fips" |> Series.values |> Array.ofSeq
let zGeoJSON: int[] = data |> Frame.getCol "unemp" |> Series.values |> Array.ofSeq
And finally put together the chart using GeoJSON:
let choroplethGeoJSON =
Chart.ChoroplethMap(
locations = locationsGeoJSON,
z = zGeoJSON,
LocationMode = StyleParam.LocationFormat.GeoJson_Id,
GeoJson = geoJson,
FeatureIdKey = "id"
)
|> Chart.withGeo (
Geo.init (
Scope = StyleParam.GeoScope.NorthAmerica,
Projection = GeoProjection.init (StyleParam.GeoProjectionType.AzimuthalEqualArea),
ShowLand = true,
LandColor = Color.fromString "lightgrey"
)
)
|> Chart.withSize (800., 800.)
<summary> Contains mutable global default values. Changing these values will apply the default values to all consecutive Chart generations. </summary>
type DisplayOptions = inherit DynamicObj new: unit -> DisplayOptions static member addAdditionalHeadTags: additionalHeadTags: XmlNode list -> (DisplayOptions -> DisplayOptions) static member addChartDescription: description: XmlNode list -> (DisplayOptions -> DisplayOptions) static member combine: first: DisplayOptions -> second: DisplayOptions -> DisplayOptions static member getAdditionalHeadTags: displayOpts: DisplayOptions -> XmlNode list static member getChartDescription: displayOpts: DisplayOptions -> XmlNode list static member getDocumentCharset: displayOpts: DisplayOptions -> string static member getDocumentDescription: displayOpts: DisplayOptions -> string static member getDocumentFavicon: displayOpts: DisplayOptions -> XmlNode ...
--------------------
new: unit -> Plotly.NET.DisplayOptions
<summary> Sets how plotly is referenced in the head of html docs. </summary>
module List from Microsoft.FSharp.Collections
--------------------
type List<'T> = | op_Nil | op_ColonColon of Head: 'T * Tail: 'T list interface IReadOnlyList<'T> interface IReadOnlyCollection<'T> interface IEnumerable interface IEnumerable<'T> member GetReverseIndex: rank: int * offset: int -> int member GetSlice: startIndex: int option * endIndex: int option -> 'T list static member Cons: head: 'T * tail: 'T list -> 'T list member Head: 'T member IsEmpty: bool member Item: index: int -> 'T with get ...
static member Chart.ChoroplethMap: locations: string seq * z: #System.IConvertible seq * ?Name: string * ?ShowLegend: bool * ?GeoJson: obj * ?FeatureIdKey: string * ?Text: 'b * ?MultiText: 'b seq * ?ColorBar: ColorBar * ?ColorScale: StyleParam.Colorscale * ?ShowScale: bool * ?ReverseScale: bool * ?LocationMode: StyleParam.LocationFormat * ?UseDefaults: bool -> GenericChart (requires 'b :> System.IConvertible)
<summary> Creates a choropleth map using plotly's base geo map. A choropleth map is a type of thematic map in which a set of pre-defined areas is colored or patterned in proportion to a statistical variable that represents an aggregate summary of a geographic characteristic within each area, such as population density or per-capita income. </summary>
<param name="locations">Sets the locations which will be colored. See LocationMode for more info.</param>
<param name="z">The color values for each location</param>
<param name="Name">Sets the trace name. The trace name appear as the legend item and on hover.</param>
<param name="ShowLegend">Determines whether or not an item corresponding to this trace is shown in the legend.</param>
<param name="GeoJson">Sets optional GeoJSON data associated with this trace. If not given, the features on the base map are used. It can be set as a valid GeoJSON object or as a URL string. Note that we only accept GeoJSONs of type "FeatureCollection" or "Feature" with geometries of type "Polygon" or "MultiPolygon".</param>
<param name="FeatureIdKey">Sets the key in GeoJSON features which is used as id to match the items included in the `locations` array. Only has an effect when `geojson` is set. Support nested property, for example "properties.name".</param>
<param name="Text">Sets the text elements associated with each location.</param>
<param name="MultiText">Sets the text elements associated with each location.</param>
<param name="ColorBar">Sets the colorbar.</param>
<param name="ColorScale">Sets the colorscale.</param>
<param name="ShowScale">Determines whether or not a colorbar is displayed for this trace.</param>
<param name="ReverseScale">Reverses the color mapping if true.</param>
<param name="LocationMode">Determines the set of locations used to match entries in `locations` to regions on the map. Values "ISO-3", "USA-states", "country names" correspond to features on the base map and value "geojson-id" corresponds to features from a custom GeoJSON linked to the `geojson` attribute.</param>
<param name="UseDefaults">If set to false, ignore the global default settings set in `Defaults`</param>
<summary> Determines the set of locations used to match entries in `locations` to regions on the map. Default: ISO-3 </summary>
<summary> The central type that gets created by all Chart constructors is GenericChart, which itself represents either a single chart or a multi chart (as a Discriminate Union type). A GenericChart consists of four top level objects: Trace (multiple of those in the case of a MultiChart), Layout, Config, and DisplayOptions. - `Trace` is in principle the representation of a dataset on a chart, including for example the data itself, color and shape of the visualization, etc. - `Layout` is everything of the chart that is not dataset specific - e.g. the shape and style of axes, the chart title, etc. - `Config` is an object that configures high level properties of the chart like making all chart elements editable or the tool bar on top - `DisplayOptions` is an object that contains meta information about how the html document that contains the chart. </summary>
type GeoProjection = inherit DynamicObj new: unit -> GeoProjection static member init: projectionType: GeoProjectionType * ?Rotation: GeoProjectionRotation * ?Parallels: (float * float) * ?Scale: float -> GeoProjection static member style: projectionType: GeoProjectionType * ?Rotation: GeoProjectionRotation * ?Parallels: (float * float) * ?Scale: float -> (GeoProjection -> GeoProjection)
<summary>Determines the map projection in geo traces.</summary>
--------------------
new: unit -> GeoProjection
<summary> Plotly color can be a single color, a sequence of colors, or a sequence of numeric values referencing the color of the colorscale obj </summary>
<summary>Provides static methods for the creation, copying, deletion, moving, and opening of a single file, and aids in the creation of <see cref="T:System.IO.FileStream" /> objects.</summary>
File.ReadAllText(path: string, encoding: System.Text.Encoding) : string
<summary> Provides methods for converting between .NET types and JSON types. </summary>
<example><code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="SerializeObject" title="Serializing and Deserializing JSON with JsonConvert" /></example>
JsonConvert.DeserializeObject(value: string) : obj
JsonConvert.DeserializeObject<'T>(value: string, settings: JsonSerializerSettings) : 'T
JsonConvert.DeserializeObject<'T>(value: string, converters: JsonConverter array) : 'T
JsonConvert.DeserializeObject(value: string, ``type`` : System.Type) : obj
JsonConvert.DeserializeObject(value: string, settings: JsonSerializerSettings) : obj
JsonConvert.DeserializeObject(value: string, ``type`` : System.Type, settings: JsonSerializerSettings) : obj
JsonConvert.DeserializeObject(value: string, ``type`` : System.Type, converters: JsonConverter array) : obj
module Frame from Deedle
--------------------
type Frame = static member ReadCsv: location: string * hasHeaders: Nullable<bool> * inferTypes: Nullable<bool> * inferRows: Nullable<int> * schema: string * separators: string * culture: string * maxRows: Nullable<int> * missingValues: string array * preferOptions: bool -> Frame<int,string> + 1 overload static member ReadReader: reader: IDataReader -> Frame<int,string> static member CustomExpanders: Dictionary<Type,Func<obj,(string * Type * obj) seq>> static member NonExpandableInterfaces: ResizeArray<Type> static member NonExpandableTypes: HashSet<Type>
--------------------
type Frame<'TRowKey,'TColumnKey (requires equality and equality)> = interface IDynamicMetaObjectProvider interface INotifyCollectionChanged interface IFrameFormattable interface IFsiFormattable interface IFrame new: rowIndex: IIndex<'TRowKey> * columnIndex: IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: IIndexBuilder * vectorBuilder: IVectorBuilder -> Frame<'TRowKey,'TColumnKey> + 1 overload member AddColumn: column: 'TColumnKey * series: 'V seq -> unit + 3 overloads member AggregateRowsBy: groupBy: 'TColumnKey seq * aggBy: 'TColumnKey seq * aggFunc: Func<Series<'TRowKey,'a>,'b> -> Frame<int,'TColumnKey> member Clone: unit -> Frame<'TRowKey,'TColumnKey> member ColumnApply: f: Func<Series<'TRowKey,'T>,ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey> + 1 overload ...
--------------------
new: names: 'TColumnKey seq * columns: ISeries<'TRowKey> seq -> Frame<'TRowKey,'TColumnKey>
new: rowIndex: Indices.IIndex<'TRowKey> * columnIndex: Indices.IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: Indices.IIndexBuilder * vectorBuilder: Vectors.IVectorBuilder -> Frame<'TRowKey,'TColumnKey>
static member Frame.ReadCsv: stream: Stream * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string array * ?preferOptions: bool -> Frame<int,string>
static member Frame.ReadCsv: reader: TextReader * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string array * ?preferOptions: bool -> Frame<int,string>
static member Frame.ReadCsv: stream: Stream * hasHeaders: System.Nullable<bool> * inferTypes: System.Nullable<bool> * inferRows: System.Nullable<int> * schema: string * separators: string * culture: string * maxRows: System.Nullable<int> * missingValues: string array * preferOptions: System.Nullable<bool> -> Frame<int,string>
static member Frame.ReadCsv: location: string * hasHeaders: System.Nullable<bool> * inferTypes: System.Nullable<bool> * inferRows: System.Nullable<int> * schema: string * separators: string * culture: string * maxRows: System.Nullable<int> * missingValues: string array * preferOptions: bool -> Frame<int,string>
static member Frame.ReadCsv: path: string * indexCol: string * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string array * ?preferOptions: bool -> Frame<'R,string> (requires equality)
static member FrameExtensions.Print: frame: Frame<'K,'V> * printTypes: bool -> unit (requires equality and equality)
val string: value: 'T -> string
--------------------
type string = System.String
module Series from Deedle
--------------------
type Series = static member ofNullables: values: Nullable<'a0> seq -> Series<int,'a0> (requires default constructor and value type and 'a0 :> ValueType) static member ofObservations: observations: ('c * 'd) seq -> Series<'c,'d> (requires equality) static member ofOptionalObservations: observations: ('K * 'a1 option) seq -> Series<'K,'a1> (requires equality) static member ofValues: values: 'a seq -> Series<int,'a>
--------------------
type Series<'K,'V (requires equality)> = interface ISeriesFormattable interface IFsiFormattable interface ISeries<'K> new: index: IIndex<'K> * vector: IVector<'V> * vectorBuilder: IVectorBuilder * indexBuilder: IIndexBuilder -> Series<'K,'V> + 3 overloads member After: lowerExclusive: 'K -> Series<'K,'V> member Aggregate: aggregation: Aggregation<'K> * keySelector: Func<DataSegment<Series<'K,'V>>,'TNewKey> * valueSelector: Func<DataSegment<Series<'K,'V>>,OptionalValue<'R>> -> Series<'TNewKey,'R> (requires equality) + 1 overload member AsyncMaterialize: unit -> Async<Series<'K,'V>> member Before: upperExclusive: 'K -> Series<'K,'V> member Between: lowerInclusive: 'K * upperInclusive: 'K -> Series<'K,'V> member Compare: another: Series<'K,'V> -> Series<'K,Diff<'V>> ...
--------------------
new: pairs: System.Collections.Generic.KeyValuePair<'K,'V> seq -> Series<'K,'V>
new: keys: 'K seq * values: 'V seq -> Series<'K,'V>
new: keys: 'K array * values: 'V array -> Series<'K,'V>
new: index: Indices.IIndex<'K> * vector: IVector<'V> * vectorBuilder: Vectors.IVectorBuilder * indexBuilder: Indices.IIndexBuilder -> Series<'K,'V>
val int: value: 'T -> int (requires member op_Explicit)
--------------------
type int = int32
--------------------
type int<'Measure> = int
<summary> Creates a choropleth map using plotly's base geo map. A choropleth map is a type of thematic map in which a set of pre-defined areas is colored or patterned in proportion to a statistical variable that represents an aggregate summary of a geographic characteristic within each area, such as population density or per-capita income. </summary>
<param name="locations">Sets the locations which will be colored. See LocationMode for more info.</param>
<param name="z">The color values for each location</param>
<param name="Name">Sets the trace name. The trace name appear as the legend item and on hover.</param>
<param name="ShowLegend">Determines whether or not an item corresponding to this trace is shown in the legend.</param>
<param name="GeoJson">Sets optional GeoJSON data associated with this trace. If not given, the features on the base map are used. It can be set as a valid GeoJSON object or as a URL string. Note that we only accept GeoJSONs of type "FeatureCollection" or "Feature" with geometries of type "Polygon" or "MultiPolygon".</param>
<param name="FeatureIdKey">Sets the key in GeoJSON features which is used as id to match the items included in the `locations` array. Only has an effect when `geojson` is set. Support nested property, for example "properties.name".</param>
<param name="Text">Sets the text elements associated with each location.</param>
<param name="MultiText">Sets the text elements associated with each location.</param>
<param name="ColorBar">Sets the colorbar.</param>
<param name="ColorScale">Sets the colorscale.</param>
<param name="ShowScale">Determines whether or not a colorbar is displayed for this trace.</param>
<param name="ReverseScale">Reverses the color mapping if true.</param>
<param name="LocationMode">Determines the set of locations used to match entries in `locations` to regions on the map. Values "ISO-3", "USA-states", "country names" correspond to features on the base map and value "geojson-id" corresponds to features from a custom GeoJSON linked to the `geojson` attribute.</param>
<param name="UseDefaults">If set to false, ignore the global default settings set in `Defaults`</param>
type Geo = inherit DynamicObj new: unit -> Geo static member init: ?FitBounds: GeoFitBounds * ?Resolution: GeoResolution * ?Scope: GeoScope * ?Projection: GeoProjection * ?Center: (float * float) * ?Visible: bool * ?Domain: Domain * ?ShowCoastLines: bool * ?CoastLineColor: Color * ?CoastLineWidth: float * ?ShowLand: bool * ?LandColor: Color * ?ShowOcean: bool * ?OceanColor: Color * ?ShowLakes: bool * ?LakeColor: Color * ?ShowRivers: bool * ?RiverColor: Color * ?RiverWidth: float * ?ShowCountries: bool * ?CountryColor: Color * ?CountryWidth: float * ?ShowSubunits: bool * ?SubunitColor: Color * ?SubunitWidth: float * ?ShowFrame: bool * ?FrameColor: Color * ?FrameWidth: float * ?BgColor: Color * ?LatAxis: LinearAxis * ?LonAxis: LinearAxis -> Geo static member style: ?FitBounds: GeoFitBounds * ?Resolution: GeoResolution * ?Scope: GeoScope * ?Projection: GeoProjection * ?Center: (float * float) * ?Visible: bool * ?Domain: Domain * ?ShowCoastLines: bool * ?CoastLineColor: Color * ?CoastLineWidth: float * ?ShowLand: bool * ?LandColor: Color * ?ShowOcean: bool * ?OceanColor: Color * ?ShowLakes: bool * ?LakeColor: Color * ?ShowRivers: bool * ?RiverColor: Color * ?RiverWidth: float * ?ShowCountries: bool * ?CountryColor: Color * ?CountryWidth: float * ?ShowSubunits: bool * ?SubunitColor: Color * ?SubunitWidth: float * ?ShowFrame: bool * ?FrameColor: Color * ?FrameWidth: float * ?BgColor: Color * ?LatAxis: LinearAxis * ?LonAxis: LinearAxis -> (Geo -> Geo)
<summary>Determines the style of the map shown in geo traces</summary>
--------------------
new: unit -> Geo
static member Chart.withSize: ?Width: int * ?Height: int -> (GenericChart -> GenericChart)
Plotly.NET