matplotlib-map-utils 3.0.0__py3-none-any.whl → 3.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- matplotlib_map_utils/core/inset_map.py +64 -40
- matplotlib_map_utils/core/north_arrow.py +24 -9
- matplotlib_map_utils/core/scale_bar.py +265 -190
- matplotlib_map_utils/defaults/scale_bar.py +5 -0
- matplotlib_map_utils/validation/functions.py +3 -6
- matplotlib_map_utils/validation/inset_map.py +3 -0
- matplotlib_map_utils/validation/north_arrow.py +1 -0
- matplotlib_map_utils/validation/scale_bar.py +7 -4
- {matplotlib_map_utils-3.0.0.dist-info → matplotlib_map_utils-3.1.0.dist-info}/METADATA +59 -8
- matplotlib_map_utils-3.1.0.dist-info/RECORD +24 -0
- {matplotlib_map_utils-3.0.0.dist-info → matplotlib_map_utils-3.1.0.dist-info}/WHEEL +1 -1
- matplotlib_map_utils-3.0.0.dist-info/RECORD +0 -24
- {matplotlib_map_utils-3.0.0.dist-info → matplotlib_map_utils-3.1.0.dist-info}/licenses/LICENSE +0 -0
- {matplotlib_map_utils-3.0.0.dist-info → matplotlib_map_utils-3.1.0.dist-info}/top_level.txt +0 -0
@@ -28,6 +28,7 @@ _BAR_XS = {
|
|
28
28
|
"minor_div":None,
|
29
29
|
"minor_frac":0.66,
|
30
30
|
"minor_type":"none",
|
31
|
+
"major_mult":None,
|
31
32
|
"facecolors":["black","white"],
|
32
33
|
"edgecolors":"black",
|
33
34
|
"edgewidth":0.5, # changed
|
@@ -99,6 +100,7 @@ _BAR_SM = {
|
|
99
100
|
"minor_div":None,
|
100
101
|
"minor_frac":0.66,
|
101
102
|
"minor_type":"none",
|
103
|
+
"major_mult":None,
|
102
104
|
"facecolors":["black","white"],
|
103
105
|
"edgecolors":"black",
|
104
106
|
"edgewidth":0.75, # changed
|
@@ -170,6 +172,7 @@ _BAR_MD = {
|
|
170
172
|
"minor_div":None,
|
171
173
|
"minor_frac":0.66,
|
172
174
|
"minor_type":"first",
|
175
|
+
"major_mult":None,
|
173
176
|
"facecolors":["black","white"],
|
174
177
|
"edgecolors":"black",
|
175
178
|
"edgewidth":1, # changed
|
@@ -241,6 +244,7 @@ _BAR_LG = {
|
|
241
244
|
"minor_div":None,
|
242
245
|
"minor_frac":0.66,
|
243
246
|
"minor_type":"first",
|
247
|
+
"major_mult":None,
|
244
248
|
"facecolors":["black","white"],
|
245
249
|
"edgecolors":"black",
|
246
250
|
"edgewidth":2, # changed
|
@@ -312,6 +316,7 @@ _BAR_XL = {
|
|
312
316
|
"minor_div":None,
|
313
317
|
"minor_frac":0.66,
|
314
318
|
"minor_type":"first",
|
319
|
+
"major_mult":None,
|
315
320
|
"facecolors":["black","white"],
|
316
321
|
"edgecolors":"black",
|
317
322
|
"edgewidth":4, # changed
|
@@ -174,8 +174,8 @@ def _validate_or(prop, val, funcs, kwargs):
|
|
174
174
|
# If we pass, we can stop here and return the value
|
175
175
|
success = True
|
176
176
|
break
|
177
|
-
except:
|
178
|
-
|
177
|
+
except Exception as e:
|
178
|
+
continue
|
179
179
|
if success == False:
|
180
180
|
# If we didn't return a value and exit the loop yet, then the passed value is incorrect, as we raise an error
|
181
181
|
raise ValueError(f"{val} is not a valid value for {prop}, please check the documentation")
|
@@ -223,7 +223,7 @@ def _validate_dict(input_dict, default_dict, functions, to_validate=None, return
|
|
223
223
|
# Pre-checking that no invalid keys are passed
|
224
224
|
invalid = [key for key in values.keys() if key not in functions.keys() and key not in ["bbox_to_anchor", "bbox_transform"]]
|
225
225
|
if len(invalid) > 0:
|
226
|
-
|
226
|
+
warnings.warn(f"Warning: Invalid keys detected ({invalid}). These will be ignored.")
|
227
227
|
# First, trimming our values to only those we need to validate
|
228
228
|
if to_validate == "input":
|
229
229
|
values = {key: val for key, val in values.items() if (key in input_dict.keys() and key in functions.keys())} # have to check against both here
|
@@ -241,9 +241,6 @@ def _validate_dict(input_dict, default_dict, functions, to_validate=None, return
|
|
241
241
|
# NOTE: This is messy but the only way to get the rotation value to the crs function
|
242
242
|
if key=="crs":
|
243
243
|
_ = func(prop=key, val=val, rotation_dict=values, **fd["kwargs"])
|
244
|
-
# NOTE: This is messy but the only way to check the projection dict without keywords
|
245
|
-
elif key=="projection":
|
246
|
-
_ = func(prop=key, val=val)
|
247
244
|
# Our custom functions always have this dictionary key in them, so we know what form they take
|
248
245
|
elif "kwargs" in fd:
|
249
246
|
_ = func(prop=key, val=val, **fd["kwargs"])
|
@@ -64,6 +64,7 @@ _VALIDATE_INSET = {
|
|
64
64
|
"pad":{"func":vf._validate_or, "kwargs":{"funcs":[vf._validate_range, vf._validate_and], "kwargs":[{"min":0, "none_ok":True}, {"funcs":[vf._validate_tuple, vf._validate_iterable], "kwargs":[{"length":2, "types":[float, int]}, {"func":vf._validate_range, "kwargs":{"min":0}}]}]}}, # between 0 and inf, or a two-tuple of (x,y) size, each between 0 and inf
|
65
65
|
"coords":{"func":vf._validate_tuple, "kwargs":{"length":2, "types":[float, int], "none_ok":True}}, # a two-tuple of coordinates where you want to place the inset map
|
66
66
|
"to_plot":{"func":vf._validate_iterable, "kwargs":{"func":vf._validate_keys, "kwargs":{"keys":["data","kwargs"], "none_ok":True}}}, # a list of dictionaries, where each contains "data" and "kwargs" keys
|
67
|
+
"zorder":{"func":vf._validate_type, "kwargs":{"match":int}}, # any int
|
67
68
|
}
|
68
69
|
|
69
70
|
_VALIDATE_EXTENT = {
|
@@ -78,6 +79,7 @@ _VALIDATE_EXTENT = {
|
|
78
79
|
"linecolor":{"func":matplotlib.rcsetup.validate_color}, # any color value for matplotlib
|
79
80
|
"alpha":{"func":vf._validate_range, "kwargs":{"min":0}}, # any positive number
|
80
81
|
"linewidth":{"func":vf._validate_range, "kwargs":{"min":0}}, # any positive number
|
82
|
+
"zorder":{"func":vf._validate_type, "kwargs":{"match":int}}, # any int
|
81
83
|
"to_return":{"func":vf._validate_list, "kwargs":{"list":["shape", "patch", "fig", "ax"], "none_ok":True}}, # any value in this list
|
82
84
|
}
|
83
85
|
|
@@ -85,4 +87,5 @@ _VALIDATE_DETAIL = {
|
|
85
87
|
"to_return":{"func":vf._validate_list, "kwargs":{"list":["connectors", "lines"], "none_ok":True}}, # any value in this list
|
86
88
|
"connector_color":{"func":matplotlib.rcsetup.validate_color}, # any color value for matplotlib
|
87
89
|
"connector_width":{"func":vf._validate_range, "kwargs":{"min":0}}, # any positive number
|
90
|
+
"zorder":{"func":vf._validate_type, "kwargs":{"match":int}}, # any int
|
88
91
|
}
|
@@ -96,6 +96,7 @@ class _TYPE_ROTATION(TypedDict, total=False):
|
|
96
96
|
_VALIDATE_PRIMARY = {
|
97
97
|
"location":{"func":vf._validate_list, "kwargs":{"list":["upper right", "upper left", "lower left", "lower right", "center left", "center right", "lower center", "upper center", "center"]}},
|
98
98
|
"scale":{"func":vf._validate_range, "kwargs":{"min":0, "max":None, "none_ok":True}}, # between 0 and inf
|
99
|
+
"zorder":{"func":vf._validate_type, "kwargs":{"match":int}}, # any int
|
99
100
|
}
|
100
101
|
|
101
102
|
_VALIDATE_BASE = {
|
@@ -37,7 +37,7 @@ preferred_divs = {
|
|
37
37
|
7:[2,1],
|
38
38
|
8:[4,2],
|
39
39
|
9:[3,3],
|
40
|
-
10:[
|
40
|
+
10:[2,1],
|
41
41
|
}
|
42
42
|
|
43
43
|
# For converting between units
|
@@ -89,6 +89,7 @@ class _TYPE_BAR(TypedDict, total=False):
|
|
89
89
|
minor_div: int # the number of minor divisions on the bar
|
90
90
|
minor_frac: float # the fraction of the major division that the minor division should be (e.g. 0.5 = half the size of the major division)
|
91
91
|
minor_type: Literal["all","first","none"] # whether the minor divisions should be drawn on all major divisions or just the first one
|
92
|
+
major_mult: float | int # used in conjunction with major_div to define the length of the bar, if desired
|
92
93
|
# Boxes only
|
93
94
|
facecolors: list | tuple | str # a color or list of colors to use for the faces of the boxes
|
94
95
|
edgecolors: list | tuple | str # a color or list of colors to use for the edges of the boxes
|
@@ -165,13 +166,14 @@ class _TYPE_AOB(TypedDict, total=False):
|
|
165
166
|
_VALIDATE_PRIMARY = {
|
166
167
|
"style":{"func":vf._validate_list, "kwargs":{"list":["ticks","boxes"]}},
|
167
168
|
"location":{"func":vf._validate_list, "kwargs":{"list":["upper right", "upper left", "lower left", "lower right", "center left", "center right", "lower center", "upper center", "center"]}},
|
169
|
+
"zorder":{"func":vf._validate_type, "kwargs":{"match":int}}, # only check that it is an int
|
168
170
|
}
|
169
171
|
|
170
172
|
_VALID_BAR_TICK_LOC = get_args(_TYPE_BAR.__annotations__["tick_loc"])
|
171
173
|
_VALID_BAR_MINOR_TYPE = get_args(_TYPE_BAR.__annotations__["minor_type"])
|
172
174
|
|
173
175
|
_VALIDATE_BAR = {
|
174
|
-
"projection":{"func":vf._validate_projection, "kwargs":{"none_ok":False}}, #
|
176
|
+
"projection":{"func":vf._validate_or, "kwargs":{"funcs":[vf._validate_projection, vf._validate_list], "kwargs":[{"none_ok":False}, {"list":["px","pixel","pixels","pt","point","points","dx","custom","axis"], "none_ok":False}]}}, # between 0 and inf, or a two-tuple of (x,y) size, each between 0 and inf
|
175
177
|
"unit":{"func":vf._validate_list, "kwargs":{"list":list(units_standard.keys()), "none_ok":True}}, # any of the listed unit values are accepted
|
176
178
|
"rotation":{"func":vf._validate_range, "kwargs":{"min":-360, "max":360, "none_ok":True}}, # between -360 and 360 degrees
|
177
179
|
"max":{"func":vf._validate_range, "kwargs":{"min":0, "max":None, "none_ok":True}}, # between 0 and inf
|
@@ -179,10 +181,11 @@ _VALIDATE_BAR = {
|
|
179
181
|
"height":{"func":vf._validate_range, "kwargs":{"min":0, "max":None, "none_ok":True}}, # between 0 and inf
|
180
182
|
"reverse":{"func":vf._validate_type, "kwargs":{"match":bool}}, # any bool
|
181
183
|
|
182
|
-
"major_div":{"func":vf._validate_range, "kwargs":{"min":1, "max":None, "none_ok":True}}, # between
|
184
|
+
"major_div":{"func":vf._validate_range, "kwargs":{"min":1, "max":None, "none_ok":True}}, # between 1 and inf
|
183
185
|
"minor_div":{"func":vf._validate_range, "kwargs":{"min":0, "max":None, "none_ok":True}}, # between 0 and inf
|
184
186
|
"minor_frac":{"func":vf._validate_range, "kwargs":{"min":0, "max":1, "none_ok":True}}, # ticks only: between 0 and 1
|
185
187
|
"minor_type":{"func":vf._validate_list, "kwargs":{"list":_VALID_BAR_MINOR_TYPE, "none_ok":True}}, # any item in the list, or None (for no minor)
|
188
|
+
"major_mult":{"func":vf._validate_range, "kwargs":{"min":0, "max":None, "none_ok":True}}, # between 0 and inf
|
186
189
|
|
187
190
|
"facecolors":{"func":vf._validate_iterable, "kwargs":{"func":matplotlib.rcsetup.validate_color}}, # boxes only: any color value for matplotlib
|
188
191
|
"edgecolors":{"func":vf._validate_iterable, "kwargs":{"func":matplotlib.rcsetup.validate_color}}, # boxes only: any color value for matplotlib
|
@@ -202,7 +205,7 @@ _VALID_LABELS_FONTWEIGHT = get_args(_TYPE_LABELS.__annotations__["fontweight"])
|
|
202
205
|
_VALID_LABELS_ROTATION_MODE = get_args(_TYPE_LABELS.__annotations__["rotation_mode"])
|
203
206
|
|
204
207
|
_VALIDATE_LABELS = {
|
205
|
-
"labels":{"func":vf._validate_iterable, "kwargs":{"func":vf._validate_types,"kwargs":{"matches":[str,bool], "none_ok":True}}}, # any list of strings
|
208
|
+
"labels":{"func":vf._validate_iterable, "kwargs":{"func":vf._validate_types,"kwargs":{"matches":[str,bool,int,float], "none_ok":True}}}, # any list of strings
|
206
209
|
"format":{"func":vf._validate_type, "kwargs":{"match":str}}, # only check that it is a string, not that it is a valid format string
|
207
210
|
"format_int":{"func":vf._validate_type, "kwargs":{"match":bool}}, # any bool
|
208
211
|
"style":{"func":vf._validate_list, "kwargs":{"list":_VALID_LABELS_STYLE}}, # any item in the list
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: matplotlib-map-utils
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.1.0
|
4
4
|
Summary: A suite of tools for creating maps in matplotlib
|
5
5
|
Author-email: David Moss <davidmoss1221@gmail.com>
|
6
6
|
Project-URL: Homepage, https://github.com/moss-xyz/matplotlib-map-utils/
|
@@ -29,7 +29,7 @@ Dynamic: license-file
|
|
29
29
|
|
30
30
|
---
|
31
31
|
|
32
|
-
### Introduction
|
32
|
+
### 👋 Introduction
|
33
33
|
|
34
34
|
`matplotlib_map_utils` is intended to be a package that provides various functions and objects that assist with the the creation of maps using [`matplotlib`](https://matplotlib.org/stable/).
|
35
35
|
|
@@ -53,7 +53,7 @@ Together, these allow for the easy creation of a map such as the following:
|
|
53
53
|
|
54
54
|
---
|
55
55
|
|
56
|
-
### Installation
|
56
|
+
### 💾 Installation
|
57
57
|
|
58
58
|
This package is available on PyPi, and can be installed like so:
|
59
59
|
|
@@ -71,7 +71,7 @@ The requirements for this package are:
|
|
71
71
|
|
72
72
|
---
|
73
73
|
|
74
|
-
### Package Structure
|
74
|
+
### 📦 Package Structure
|
75
75
|
|
76
76
|
<details>
|
77
77
|
<summary><i>The package is arrayed in the following way:</i></summary>
|
@@ -211,6 +211,8 @@ There are two available styles for the scale bars: `boxes` and `ticks`. The quic
|
|
211
211
|
|
212
212
|
```python
|
213
213
|
# Setting up a plot
|
214
|
+
# NOTE: you MUST set the desired DPI here, when the subplots are created
|
215
|
+
# so that the scale_bar's DPI matches!
|
214
216
|
fig, ax = matplotlib.pyplot.subplots(1,1, figsize=(5,5), dpi=150)
|
215
217
|
# Adding a scale bar to the upper-right corner of the axis, in the same projection as whatever geodata you plotted
|
216
218
|
# Here, this scale bar will have the "boxes" style
|
@@ -221,6 +223,8 @@ An object-oriented approach is also supported:
|
|
221
223
|
|
222
224
|
```python
|
223
225
|
# Setting up a plot
|
226
|
+
# NOTE: you MUST set the desired DPI here, when the subplots are created
|
227
|
+
# so that the scale_bar's DPI matches!
|
224
228
|
fig, ax = matplotlib.pyplot.subplots(1,1, figsize=(5,5), dpi=150)
|
225
229
|
# Adding a scale bar to the upper-right corner of the axis, in the same projection as whatever geodata you plotted
|
226
230
|
# Here, we change the boxes to "ticks"
|
@@ -256,6 +260,38 @@ This will create an output like the following:
|
|
256
260
|
|
257
261
|
Refer to `docs\howto_scale_bar` for details on how to customize each facet of the scale bar.
|
258
262
|
|
263
|
+
#### Specifying Length
|
264
|
+
|
265
|
+
There are three main ways of specifying the length of a scale bar:
|
266
|
+
|
267
|
+
- `length` is used to set the total length of the bar, either in _inches_ (for values >= 1) or as a _fraction of the axis_ (for values < 1).
|
268
|
+
- The default value of the scale bar utilizes this method, with a `length` value of `0.25` (meaning 25% of the axis).
|
269
|
+
- It will automatically orient itself against the horizontal or vertical axis when calculating its fraction, based on the value supplied for `rotation`.
|
270
|
+
- Note that any values here will be rounded to a "nice" whole integer, so the length will *always be approximate*; ex., if two inches is 9,128 units, your scale bar will end up being 9,000 units, and therefore a little less than two inches.
|
271
|
+
- Values `major_div` and `minor_div` are ignored, while a value for `max` will _override_ `length`.
|
272
|
+
|
273
|
+
- `max` is used to define the total length of the bar, _in the same units as your map_, as determined by the value of `projection` and `unit`.
|
274
|
+
- Ex: If you are using a projection in feet, and give a `max` of `1000`, your scale bar will be representative of 1,000 feet.
|
275
|
+
- Ex: If you are using a projection in feet, but provide a value of `meter` to `unit`, and give a `max` of `1000`, your scale bar will be representative of 1,000 meters.
|
276
|
+
- Will _override_ any value provided for `length`, and give a warning that it is doing so!
|
277
|
+
- Values can be optionally be provided for `major_div` and `minor_div`, to subdivide the bar into major or minor segments as you desire; if left blank, values for these will be calculated automatically (see `preferred_divs` in `validation/scale_bar.py` for the values used).
|
278
|
+
|
279
|
+
- `major_mult` can be used alongside `major_div` to _derive_ the total length: `major_mult` is the _length of a **single** major division_, in the _same units as your map_ (as determined by the value of `projection` and `unit`), which is then multiplied out by `major_div` to arrive at the desired length of the bar.
|
280
|
+
- Ex: If you set `major_mult` to 1,000, and `major_div` to 3, your bar will be 3,000 units long, divided into three 1,000 segments.
|
281
|
+
- This is the _only_ use case for `major_mult` - using it anywhere else will result in warnings and/or errors!
|
282
|
+
- Specifying either `max` or `length` will override this method!
|
283
|
+
- `minor_div` can still be _optionally_ provided.
|
284
|
+
|
285
|
+
All of the above cases expect a valid CRS to be supplied to the `projection` parameter, to correctly calculate the relative size of the bar with respect to the map's underlying units. However, three _additional_ values may be passed to `projection`, to override this behavior entirely:
|
286
|
+
|
287
|
+
- If `projection` is set to `px`, `pixel`, or `pixels`, then values for `max` and `major_mult` are interpreted as being in _pixels_ (so a `max` of 1,000 will result in a bar 1,000 pixels long)
|
288
|
+
|
289
|
+
- If `projection` is set to `pt`, `point`, or `points`, then values for `max` and `major_mult` are interpreted as being in _points_ (so a `max` of 1,000 will result in a bar 1,000 points long (a point is 1/72 of an inch))
|
290
|
+
|
291
|
+
- If `projection` is set to `dx`, `custom`, or `axis`, then values for `max` and `major_mult` are interpreted as being in _the units of the x or y axis_ (so a `max` of 1,000 will result in a bar equal to 1,000 units of the x-axis (if orientated horizontally))
|
292
|
+
|
293
|
+
The intent of these additional methods is to provide an alternative interface for defining the bar, in the case of non-standard projections, or for non-cartographic use cases (in particular, this is inspired by the `dx` implementation of `matplotlib-scalebar`). However, this puts the onus on the user to know how big their bar should be - you also cannot pass a value to `unit` to convert! Note you can provide custom label text to the bar via the `labels` and `units` arguments (ex. if you need to label "inches" or something).
|
294
|
+
|
259
295
|
</details>
|
260
296
|
|
261
297
|
---
|
@@ -343,7 +379,7 @@ usa = USA()
|
|
343
379
|
# Getting a list FIPS codes for US States
|
344
380
|
usa.filter(states=True, to_return="fips")
|
345
381
|
# Getting a list of State Names for states in the South and Midwest regions
|
346
|
-
usa.filter(region=["South","
|
382
|
+
usa.filter(region=["South","Midwest"], to_return="name")
|
347
383
|
```
|
348
384
|
|
349
385
|
Refer to `docs\howto_utils` for details on how to use this class, including with `pandas.apply()`.
|
@@ -352,7 +388,7 @@ Refer to `docs\howto_utils` for details on how to use this class, including with
|
|
352
388
|
|
353
389
|
---
|
354
390
|
|
355
|
-
### Development Notes
|
391
|
+
### 📝 Development Notes
|
356
392
|
|
357
393
|
#### Inspiration and Thanks
|
358
394
|
|
@@ -366,6 +402,9 @@ Two more projects assisted with the creation of this script:
|
|
366
402
|
|
367
403
|
#### Releases
|
368
404
|
|
405
|
+
<details>
|
406
|
+
<summary><i>See prior release notes</i></summary>
|
407
|
+
|
369
408
|
- `v1.0.x`: Initial releases featuring the North Arrow element, along with some minor bug fixes.
|
370
409
|
|
371
410
|
- `v2.0.0`: Initial release of the Scale Bar element.
|
@@ -376,13 +415,21 @@ Two more projects assisted with the creation of this script:
|
|
376
415
|
|
377
416
|
- `v2.1.0`: Added a utility class, `USA`, for filtering subsets of US states and territories based on FIPS code, name, abbreviation, region, division, and more. This is considered a beta release, and might be subject to change later on.
|
378
417
|
|
418
|
+
</details>
|
419
|
+
<br>
|
420
|
+
|
379
421
|
- `v3.0.0`: Release of inset map and extent and detail indicator classes and functions.
|
380
422
|
|
423
|
+
- `v3.0.1`: Fixed a bug that led to an incorrect Scale Bar being rendered when using the function method (`scale_bar()`) on a plot containing raster data (see [here](https://github.com/moss-xyz/matplotlib-map-utils/issues/10) for details).
|
424
|
+
|
425
|
+
- `v3.1.0`: Overhauled the functionality for specifying the the length of a scale bar, including support for custom units/projections (similar to `matplotlib-scalebar`'s `dx` argument) and to specify the length of a major division instead of the entire scale bar, as requested [here](https://github.com/moss-xyz/matplotlib-map-utils/issues/10). Added ability to set artist-level `zorder` variables for all elements, with both the function and class method approaches, as requested [here](https://github.com/moss-xyz/matplotlib-map-utils/issues/9) and [here](https://github.com/moss-xyz/matplotlib-map-utils/issues/10). Also fixed a bug related to custom division labels on the scale bar.
|
426
|
+
|
381
427
|
#### Future Roadmap
|
382
428
|
|
383
429
|
With the release of `v3.x`, this project has achieved full coverage of the "main" map elements I think are necessary.
|
384
430
|
|
385
|
-
|
431
|
+
<details>
|
432
|
+
<summary><i>If I continue development of this project, I will be looking to add or fix the following features:</i></summary>
|
386
433
|
|
387
434
|
* For all: switch to a system based on Pydantic for easier type validation
|
388
435
|
|
@@ -418,14 +465,18 @@ If I continue development of this project, I will be looking to add or fix the f
|
|
418
465
|
|
419
466
|
Future releases (if the project is continued) will probably focus on other functions that I have created myself that give more control in the formatting of maps. I am also open to ideas for other extensions to create!
|
420
467
|
|
468
|
+
</details>
|
469
|
+
|
421
470
|
#### Support and Contributions
|
422
471
|
|
423
472
|
If you notice something is not working as intended or if you'd like to add a feature yourself, I welcome PRs - just be sure to be descriptive as to what you are changing and why, including code examples!
|
424
473
|
|
425
474
|
If you are having issues using this script, feel free to leave a post explaining your issue, and I will try and assist, though I have no guaranteed SLAs as this is just a hobby project.
|
426
475
|
|
476
|
+
I am open to contributions, especially to help tackle the roadmap above!
|
477
|
+
|
427
478
|
---
|
428
479
|
|
429
|
-
### License
|
480
|
+
### ⚖️ License
|
430
481
|
|
431
482
|
I know nothing about licensing, so I went with the GPL license. If that is incompatible with any of the dependencies, please let me know.
|
@@ -0,0 +1,24 @@
|
|
1
|
+
matplotlib_map_utils/__init__.py,sha256=2mL2sZOjfxC--EthFMTMuYh1uvozz-9PzM4EDprDicU,949
|
2
|
+
matplotlib_map_utils/core/__init__.py,sha256=mIn7x-LZlvNaYMcmjZXwnKNTirv3Vv2lAJodwRg_AdU,471
|
3
|
+
matplotlib_map_utils/core/inset_map.py,sha256=iJISV0gZ3OmhO-DzC5z5kH5qL8fpdqmHn5OkdhdtzAY,41561
|
4
|
+
matplotlib_map_utils/core/north_arrow.py,sha256=UDn0TBnLuhuONbibb_XT8C2HNSY6ONLCQgadR19WpmI,22846
|
5
|
+
matplotlib_map_utils/core/scale_bar.py,sha256=IEWosGJeelvuTfbG5EeLyfoyGN5GZO0C1rlEfF8onDc,66845
|
6
|
+
matplotlib_map_utils/defaults/__init__.py,sha256=_pegE5kv_sb0ansSF4XpWBRwboaP4zUjWY1KIGbK-TE,119
|
7
|
+
matplotlib_map_utils/defaults/inset_map.py,sha256=RNwaZqWjDjdNwPgmqx_cN9lQQ6DW_Db61peaeMRCPlc,1569
|
8
|
+
matplotlib_map_utils/defaults/north_arrow.py,sha256=uZb1RsUWxFTHywm8HATj_9iPF_GjCs_Z2HOn0JchjTY,8571
|
9
|
+
matplotlib_map_utils/defaults/scale_bar.py,sha256=422U5hBtLpXrWZuj7vOnZNmIWI_KnOgDIwRX__m4GCY,8345
|
10
|
+
matplotlib_map_utils/scratch/map_utils.py,sha256=j8dOX9uuotl9rRCAXapFLHycUwVE4nzIrqWYOGG2Lgg,19653
|
11
|
+
matplotlib_map_utils/scratch/north_arrow_old_classes.py,sha256=1xKQ6yUghX4BWzIv8GsGBHDDPJ8B0Na7ixdw2jgtTqw,50993
|
12
|
+
matplotlib_map_utils/utils/__init__.py,sha256=uUy0kUMMGrDpvo88J_OLk2dQI-UwCXclccaEyk8x5R0,41
|
13
|
+
matplotlib_map_utils/utils/usa.json,sha256=kLB9JXNSWf8VU-9XwXuMRAPKO-zA4aluQUEln7Ktc_s,26563
|
14
|
+
matplotlib_map_utils/utils/usa.py,sha256=7SlUdxtCan5PFNIoLe-HfOC5r2cxJAF-9QKhNIK71EI,16853
|
15
|
+
matplotlib_map_utils/validation/__init__.py,sha256=0fL3N63jxjRwTU44b7-6ZYZJfOT_0ac7dx7M6Gpu_5M,52
|
16
|
+
matplotlib_map_utils/validation/functions.py,sha256=IIT9DiPKVv_ZHUTC8FwXJPt2pzdQI-8zhx6SHqto65E,13020
|
17
|
+
matplotlib_map_utils/validation/inset_map.py,sha256=C5e_zOBKHqVNgufhwoIxu1OhlvXoaj70WxreW4BSfnA,6019
|
18
|
+
matplotlib_map_utils/validation/north_arrow.py,sha256=6D-uLiMmre0E9JwjR0BTWNZJyCqPuL0b3HGZ91UHoXw,10442
|
19
|
+
matplotlib_map_utils/validation/scale_bar.py,sha256=dYhiuqBV8wkMmFsR8p4RMbfBmN1DU--5cWU-Om9m7UY,18162
|
20
|
+
matplotlib_map_utils-3.1.0.dist-info/licenses/LICENSE,sha256=aFLFZg6LEJFpTlNQ8su3__jw4GfV-xWBmC1cePkKZVw,35802
|
21
|
+
matplotlib_map_utils-3.1.0.dist-info/METADATA,sha256=uUaExw-HxCickvfeR8LkMiG2SVO1jUqNXxoejuW2OLI,21633
|
22
|
+
matplotlib_map_utils-3.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
23
|
+
matplotlib_map_utils-3.1.0.dist-info/top_level.txt,sha256=6UyDpxsnMhSOd9a-abQe0lLJveybJyYtUHMdX7zXgKA,21
|
24
|
+
matplotlib_map_utils-3.1.0.dist-info/RECORD,,
|
@@ -1,24 +0,0 @@
|
|
1
|
-
matplotlib_map_utils/__init__.py,sha256=2mL2sZOjfxC--EthFMTMuYh1uvozz-9PzM4EDprDicU,949
|
2
|
-
matplotlib_map_utils/core/__init__.py,sha256=mIn7x-LZlvNaYMcmjZXwnKNTirv3Vv2lAJodwRg_AdU,471
|
3
|
-
matplotlib_map_utils/core/inset_map.py,sha256=-lZxiORndgYQAZzAerPaMlH95zrRsBspdwxIzHcn_2Q,40880
|
4
|
-
matplotlib_map_utils/core/north_arrow.py,sha256=BXagxPdy0uCWpGTFvw-qnaZZKZlXsINTha0sqaBRK-M,22415
|
5
|
-
matplotlib_map_utils/core/scale_bar.py,sha256=qVJYUGnajEfW6FeQ37V_6tEHPbu4V-8B0K4XfU7c8YQ,62101
|
6
|
-
matplotlib_map_utils/defaults/__init__.py,sha256=_pegE5kv_sb0ansSF4XpWBRwboaP4zUjWY1KIGbK-TE,119
|
7
|
-
matplotlib_map_utils/defaults/inset_map.py,sha256=RNwaZqWjDjdNwPgmqx_cN9lQQ6DW_Db61peaeMRCPlc,1569
|
8
|
-
matplotlib_map_utils/defaults/north_arrow.py,sha256=uZb1RsUWxFTHywm8HATj_9iPF_GjCs_Z2HOn0JchjTY,8571
|
9
|
-
matplotlib_map_utils/defaults/scale_bar.py,sha256=GpXiWUHcOsv43G1HOfpqw-dzDPQQzQB7RNdtIf0e7Bc,8225
|
10
|
-
matplotlib_map_utils/scratch/map_utils.py,sha256=j8dOX9uuotl9rRCAXapFLHycUwVE4nzIrqWYOGG2Lgg,19653
|
11
|
-
matplotlib_map_utils/scratch/north_arrow_old_classes.py,sha256=1xKQ6yUghX4BWzIv8GsGBHDDPJ8B0Na7ixdw2jgtTqw,50993
|
12
|
-
matplotlib_map_utils/utils/__init__.py,sha256=uUy0kUMMGrDpvo88J_OLk2dQI-UwCXclccaEyk8x5R0,41
|
13
|
-
matplotlib_map_utils/utils/usa.json,sha256=kLB9JXNSWf8VU-9XwXuMRAPKO-zA4aluQUEln7Ktc_s,26563
|
14
|
-
matplotlib_map_utils/utils/usa.py,sha256=7SlUdxtCan5PFNIoLe-HfOC5r2cxJAF-9QKhNIK71EI,16853
|
15
|
-
matplotlib_map_utils/validation/__init__.py,sha256=0fL3N63jxjRwTU44b7-6ZYZJfOT_0ac7dx7M6Gpu_5M,52
|
16
|
-
matplotlib_map_utils/validation/functions.py,sha256=gh3d6Gj1klL8jb0nOwavIe3b9KFpOOCgQx1dYv-XMTw,13173
|
17
|
-
matplotlib_map_utils/validation/inset_map.py,sha256=g5YQByVnQBtRb_PI8xqghkJ0IGdBtYvwNwQz_-ddQ4U,5791
|
18
|
-
matplotlib_map_utils/validation/north_arrow.py,sha256=Vs9ljD0PbxBI7-4J8PkzC8SRI-LCgZDnIrL1xA6h77E,10366
|
19
|
-
matplotlib_map_utils/validation/scale_bar.py,sha256=XrnGoAXwJFUTOnvoei1pqVJKu-BxcAaih27H6a4CXgk,17625
|
20
|
-
matplotlib_map_utils-3.0.0.dist-info/licenses/LICENSE,sha256=aFLFZg6LEJFpTlNQ8su3__jw4GfV-xWBmC1cePkKZVw,35802
|
21
|
-
matplotlib_map_utils-3.0.0.dist-info/METADATA,sha256=OqqR0p5BphIlwUHJWH8iEP9mQlVfjtY_iTE6jBxlZSE,16354
|
22
|
-
matplotlib_map_utils-3.0.0.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
|
23
|
-
matplotlib_map_utils-3.0.0.dist-info/top_level.txt,sha256=6UyDpxsnMhSOd9a-abQe0lLJveybJyYtUHMdX7zXgKA,21
|
24
|
-
matplotlib_map_utils-3.0.0.dist-info/RECORD,,
|
{matplotlib_map_utils-3.0.0.dist-info → matplotlib_map_utils-3.1.0.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
File without changes
|