lets-plot 4.8.0rc1__cp313-cp313-macosx_12_0_arm64.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.

Potentially problematic release.


This version of lets-plot might be problematic. Click here for more details.

Files changed (95) hide show
  1. lets_plot/__init__.py +283 -0
  2. lets_plot/_global_settings.py +192 -0
  3. lets_plot/_kbridge.py +149 -0
  4. lets_plot/_type_utils.py +133 -0
  5. lets_plot/_version.py +6 -0
  6. lets_plot/bistro/__init__.py +16 -0
  7. lets_plot/bistro/_plot2d_common.py +106 -0
  8. lets_plot/bistro/corr.py +448 -0
  9. lets_plot/bistro/im.py +196 -0
  10. lets_plot/bistro/joint.py +192 -0
  11. lets_plot/bistro/qq.py +207 -0
  12. lets_plot/bistro/residual.py +341 -0
  13. lets_plot/bistro/waterfall.py +332 -0
  14. lets_plot/export/__init__.py +6 -0
  15. lets_plot/export/ggsave_.py +170 -0
  16. lets_plot/frontend_context/__init__.py +8 -0
  17. lets_plot/frontend_context/_configuration.py +151 -0
  18. lets_plot/frontend_context/_frontend_ctx.py +16 -0
  19. lets_plot/frontend_context/_html_contexts.py +117 -0
  20. lets_plot/frontend_context/_intellij_python_json_ctx.py +38 -0
  21. lets_plot/frontend_context/_json_contexts.py +39 -0
  22. lets_plot/frontend_context/_jupyter_notebook_ctx.py +119 -0
  23. lets_plot/frontend_context/_mime_types.py +7 -0
  24. lets_plot/frontend_context/_static_html_page_ctx.py +27 -0
  25. lets_plot/frontend_context/_static_svg_ctx.py +26 -0
  26. lets_plot/frontend_context/_webbr_html_page_ctx.py +29 -0
  27. lets_plot/frontend_context/sandbox.py +5 -0
  28. lets_plot/geo_data/__init__.py +19 -0
  29. lets_plot/geo_data/core.py +335 -0
  30. lets_plot/geo_data/geocoder.py +988 -0
  31. lets_plot/geo_data/geocodes.py +512 -0
  32. lets_plot/geo_data/gis/__init__.py +0 -0
  33. lets_plot/geo_data/gis/fluent_dict.py +201 -0
  34. lets_plot/geo_data/gis/geocoding_service.py +42 -0
  35. lets_plot/geo_data/gis/geometry.py +91 -0
  36. lets_plot/geo_data/gis/json_request.py +232 -0
  37. lets_plot/geo_data/gis/json_response.py +308 -0
  38. lets_plot/geo_data/gis/request.py +492 -0
  39. lets_plot/geo_data/gis/response.py +247 -0
  40. lets_plot/geo_data/livemap_helper.py +65 -0
  41. lets_plot/geo_data/to_geo_data_frame.py +141 -0
  42. lets_plot/geo_data/type_assertion.py +34 -0
  43. lets_plot/geo_data_internals/__init__.py +4 -0
  44. lets_plot/geo_data_internals/constants.py +13 -0
  45. lets_plot/geo_data_internals/utils.py +33 -0
  46. lets_plot/mapping.py +115 -0
  47. lets_plot/package_data/lets-plot.min.js +3 -0
  48. lets_plot/plot/__init__.py +64 -0
  49. lets_plot/plot/_global_theme.py +14 -0
  50. lets_plot/plot/annotation.py +290 -0
  51. lets_plot/plot/coord.py +242 -0
  52. lets_plot/plot/core.py +1025 -0
  53. lets_plot/plot/expand_limits_.py +78 -0
  54. lets_plot/plot/facet.py +210 -0
  55. lets_plot/plot/font_features.py +71 -0
  56. lets_plot/plot/geom.py +9144 -0
  57. lets_plot/plot/geom_extras.py +53 -0
  58. lets_plot/plot/geom_function_.py +219 -0
  59. lets_plot/plot/geom_imshow_.py +393 -0
  60. lets_plot/plot/geom_livemap_.py +343 -0
  61. lets_plot/plot/ggbunch_.py +96 -0
  62. lets_plot/plot/gggrid_.py +139 -0
  63. lets_plot/plot/ggtb_.py +81 -0
  64. lets_plot/plot/guide.py +231 -0
  65. lets_plot/plot/label.py +187 -0
  66. lets_plot/plot/marginal_layer.py +181 -0
  67. lets_plot/plot/plot.py +245 -0
  68. lets_plot/plot/pos.py +344 -0
  69. lets_plot/plot/sampling.py +338 -0
  70. lets_plot/plot/sandbox_.py +26 -0
  71. lets_plot/plot/scale.py +3580 -0
  72. lets_plot/plot/scale_colormap_mpl.py +300 -0
  73. lets_plot/plot/scale_convenience.py +155 -0
  74. lets_plot/plot/scale_identity_.py +662 -0
  75. lets_plot/plot/scale_position.py +1342 -0
  76. lets_plot/plot/series_meta.py +209 -0
  77. lets_plot/plot/stat.py +585 -0
  78. lets_plot/plot/subplots.py +331 -0
  79. lets_plot/plot/subplots_util.py +24 -0
  80. lets_plot/plot/theme_.py +795 -0
  81. lets_plot/plot/theme_set.py +418 -0
  82. lets_plot/plot/tooltip.py +486 -0
  83. lets_plot/plot/util.py +267 -0
  84. lets_plot/settings_utils.py +244 -0
  85. lets_plot/tilesets.py +429 -0
  86. lets_plot-4.8.0rc1.dist-info/METADATA +220 -0
  87. lets_plot-4.8.0rc1.dist-info/RECORD +95 -0
  88. lets_plot-4.8.0rc1.dist-info/WHEEL +5 -0
  89. lets_plot-4.8.0rc1.dist-info/licenses/LICENSE +21 -0
  90. lets_plot-4.8.0rc1.dist-info/licenses/licenses/LICENSE.FreeType +166 -0
  91. lets_plot-4.8.0rc1.dist-info/licenses/licenses/LICENSE.ImageMagick +106 -0
  92. lets_plot-4.8.0rc1.dist-info/licenses/licenses/LICENSE.expat +21 -0
  93. lets_plot-4.8.0rc1.dist-info/licenses/licenses/LICENSE.fontconfig +200 -0
  94. lets_plot-4.8.0rc1.dist-info/top_level.txt +2 -0
  95. lets_plot_kotlin_bridge.cpython-313-darwin.so +0 -0
@@ -0,0 +1,27 @@
1
+ #
2
+ # Copyright (c) 2019. JetBrains s.r.o.
3
+ # Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4
+ #
5
+ from typing import Dict
6
+
7
+ from ._frontend_ctx import FrontendContext
8
+ from .. import _kbridge as kbr
9
+ from .._version import __version__
10
+
11
+
12
+ # noinspection PyPackageRequirements
13
+
14
+
15
+ class StaticHtmlPageContext(FrontendContext):
16
+
17
+ def __init__(self, offline: bool) -> None:
18
+ super().__init__()
19
+ self.connected = not offline
20
+
21
+ def configure(self, verbose: bool):
22
+ # Nothing here because the entire html page is created per each cell output.
23
+ if not self.connected:
24
+ print("WARN: Embedding Lets-Plot JS library for offline usage is not supported.")
25
+
26
+ def as_str(self, plot_spec: Dict) -> str:
27
+ return kbr._generate_static_html_page(plot_spec, iframe=False)
@@ -0,0 +1,26 @@
1
+ #
2
+ # Copyright (c) 2020. JetBrains s.r.o.
3
+ # Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4
+ #
5
+ from typing import Dict
6
+
7
+ from ._frontend_ctx import FrontendContext
8
+ from .. import _kbridge as kbr
9
+ from .._version import __version__
10
+
11
+
12
+ class StaticSvgImageContext(FrontendContext):
13
+
14
+ def configure(self, verbose: bool):
15
+ if verbose:
16
+ message = '<div style="color:darkblue;">Lets-Plot v{}: static SVG output configured.</div>'.format(
17
+ __version__)
18
+ try:
19
+ from IPython.display import display_html
20
+ display_html(message, raw=True)
21
+ except ImportError:
22
+ pass
23
+ print(message)
24
+
25
+ def as_str(self, plot_spec: Dict) -> str:
26
+ return kbr._generate_svg(plot_spec)
@@ -0,0 +1,29 @@
1
+ #
2
+ # Copyright (c) 2019. JetBrains s.r.o.
3
+ # Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4
+ #
5
+ import io
6
+ import webbrowser
7
+ import tempfile
8
+ from typing import Dict
9
+
10
+ from ._frontend_ctx import FrontendContext
11
+ from .. import _kbridge as kbr
12
+
13
+
14
+ class WebBrHtmlPageContext(FrontendContext):
15
+
16
+ def __init__(self, exec: str, new: bool) -> None:
17
+ super().__init__()
18
+ self.exec = exec
19
+ self.new = new
20
+
21
+ def show(self, plot_spec: Dict) -> str:
22
+ html_page = kbr._generate_static_html_page(plot_spec, iframe=False)
23
+
24
+ path = tempfile.NamedTemporaryFile(mode='w+t', suffix=".html", delete=False)
25
+ try:
26
+ io.open(path.name, 'w+t').write(html_page)
27
+ webbrowser.get(self.exec).open('file://' + path.name, new=1 if self.new else 2)
28
+ finally:
29
+ path.close()
@@ -0,0 +1,5 @@
1
+ #
2
+ # Copyright (c) 2019. JetBrains s.r.o.
3
+ # Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4
+ #
5
+
@@ -0,0 +1,19 @@
1
+ try:
2
+ import geopandas
3
+ except ImportError:
4
+ print("geopandas is required for using the geo_data package")
5
+ raise
6
+
7
+ from .core import *
8
+ from .geocoder import *
9
+ from .geocodes import *
10
+
11
+ __all__ = core.__all__
12
+
13
+ # Use geo_data package only for executing geocoding requests.
14
+ # For accessing variuous checks, contants, types etc use package geo_data_internals
15
+ # as it won't cause the OSM attribution to appear.
16
+
17
+ # print on the package import
18
+ print("The geodata is provided by © OpenStreetMap contributors"
19
+ " and is made available here under the Open Database License (ODbL).")
@@ -0,0 +1,335 @@
1
+ from typing import Any
2
+
3
+ import numpy as np
4
+
5
+ from .geocoder import Geocoder, ReverseGeocoder, NamesGeocoder
6
+
7
+ __all__ = [
8
+ 'distance',
9
+
10
+ 'geocode',
11
+ 'geocode_cities',
12
+ 'geocode_counties',
13
+ 'geocode_states',
14
+ 'geocode_countries',
15
+ 'reverse_geocode'
16
+ ]
17
+
18
+ UNITS_DICT = {
19
+ 'mi': 3959,
20
+ 'km': 6371
21
+ }
22
+
23
+ GEOFUNC_TYPES = {
24
+ 'centroids': 'centroids',
25
+ 'boundaries': 'boundaries',
26
+ 'limits': 'limits',
27
+ 'region': 'regions'
28
+ }
29
+
30
+
31
+ def geocode(level=None, names=None, countries=None, states=None, counties=None, scope=None) -> NamesGeocoder:
32
+ """
33
+ Create a `NamesGeocoder <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html>`__.
34
+ Allow to refine ambiguous request with `where() <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html#lets_plot.geo_data.NamesGeocoder.where>`__ method,
35
+ scope that limits area of geocoding or with parents.
36
+
37
+ Parameters
38
+ ----------
39
+ level : {'country', 'state', 'county', 'city'}
40
+ The level of administrative division. Autodetection by default.
41
+ names : list or str
42
+ Names of objects to be geocoded.
43
+ For 'state' level: 'US-48' returns continental part of United States (48 states)
44
+ in a compact form.
45
+ countries : list
46
+ Parent countries. Should have same size as names. Can contain strings or ``Geocoder`` objects.
47
+ states : list
48
+ Parent states. Should have same size as names. Can contain strings or ``Geocoder`` objects.
49
+ counties : list
50
+ Parent counties. Should have same size as names. Can contain strings or ``Geocoder`` objects.
51
+ scope : str or ``Geocoder``
52
+ Limits area of geocoding. If parent country is set then error will be generated.
53
+ If type is a string - geoobject should have geocoded scope in parents.
54
+ If type is a ``Geocoder`` - geoobject should have geocoded scope in parents.
55
+ Scope should contain only one entry.
56
+
57
+ Returns
58
+ -------
59
+ ``NamesGeocoder``
60
+ Geocoder object specification.
61
+
62
+ Examples
63
+ --------
64
+ .. jupyter-execute::
65
+ :linenos:
66
+ :emphasize-lines: 5
67
+
68
+ from IPython.display import display
69
+ from lets_plot import *
70
+ from lets_plot.geo_data import *
71
+ LetsPlot.setup_html()
72
+ states = geocode('state').scope('Italy').get_boundaries(6)
73
+ display(states.head())
74
+ ggplot() + geom_map(data=states)
75
+
76
+ |
77
+
78
+ .. jupyter-execute::
79
+ :linenos:
80
+ :emphasize-lines: 5, 8
81
+
82
+ from IPython.display import display
83
+ from lets_plot import *
84
+ from lets_plot.geo_data import *
85
+ LetsPlot.setup_html()
86
+ states = geocode(level='state', scope='US').get_geocodes()
87
+ display(states.head())
88
+ names = ['York'] * len(states.state)
89
+ cities = geocode(names=names, states=states.state).ignore_not_found().get_centroids()
90
+ display(cities.head())
91
+ ggplot() + \\
92
+ geom_livemap() + \\
93
+ geom_point(data=cities, tooltips=layer_tooltips().line('@{found name}'))
94
+
95
+ """
96
+ return NamesGeocoder(level, names) \
97
+ .scope(scope) \
98
+ .countries(countries) \
99
+ .states(states) \
100
+ .counties(counties)
101
+
102
+
103
+ def geocode_cities(names=None) -> NamesGeocoder:
104
+ """
105
+ Create a `NamesGeocoder <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html>`__ object for cities.
106
+ Allow to refine ambiguous request with `where() <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html#lets_plot.geo_data.NamesGeocoder.where>`__ method,
107
+ with a scope that limits area of geocoding or with parents.
108
+
109
+ Parameters
110
+ ----------
111
+ names : str or list
112
+ Names of objects to be geocoded.
113
+
114
+ Returns
115
+ -------
116
+ ``NamesGeocoder``
117
+ Geocoder object specification.
118
+
119
+ Examples
120
+ --------
121
+ .. jupyter-execute::
122
+ :linenos:
123
+ :emphasize-lines: 5
124
+
125
+ from IPython.display import display
126
+ from lets_plot import *
127
+ from lets_plot.geo_data import *
128
+ LetsPlot.setup_html()
129
+ cities = geocode_cities(['York', 'Jersey'])\\
130
+ .where(name='Jersey', scope='New Jersey').get_boundaries()
131
+ display(cities)
132
+ ggplot() + geom_map(aes(fill='found name'), data=cities, color='white')
133
+
134
+ """
135
+ return NamesGeocoder('city', names)
136
+
137
+
138
+ def geocode_counties(names=None) -> NamesGeocoder:
139
+ """
140
+ Create a `NamesGeocoder <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html>`__ object for counties.
141
+ Allow to refine ambiguous request with `where() <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html#lets_plot.geo_data.NamesGeocoder.where>`__ method,
142
+ with a scope that limits area of geocoding or with parents.
143
+
144
+ Parameters
145
+ ----------
146
+ names : str or list
147
+ Names of objects to be geocoded.
148
+
149
+ Returns
150
+ -------
151
+ ``NamesGeocoder``
152
+ Geocoder object specification.
153
+
154
+ Examples
155
+ --------
156
+ .. jupyter-execute::
157
+ :linenos:
158
+ :emphasize-lines: 5
159
+
160
+ from IPython.display import display
161
+ from lets_plot import *
162
+ from lets_plot.geo_data import *
163
+ LetsPlot.setup_html()
164
+ counties = geocode_counties().scope('NY').get_boundaries(9)
165
+ display(counties.head())
166
+ ggplot() + geom_map(data=counties) + ggtitle('New York State Counties')
167
+
168
+ """
169
+ return NamesGeocoder('county', names)
170
+
171
+
172
+ def geocode_states(names=None) -> NamesGeocoder:
173
+ """
174
+ Create a `NamesGeocoder <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html>`__ object for states.
175
+ Allow to refine ambiguous request with `where() <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html#lets_plot.geo_data.NamesGeocoder.where>`__ method,
176
+ with a scope that limits area of geocoding or with parents.
177
+
178
+ Parameters
179
+ ----------
180
+ names : str or list
181
+ Names of objects to be geocoded.
182
+
183
+ Returns
184
+ -------
185
+ ``NamesGeocoder``
186
+ Geocoder object specification.
187
+
188
+ Examples
189
+ --------
190
+ .. jupyter-execute::
191
+ :linenos:
192
+ :emphasize-lines: 5
193
+
194
+ from IPython.display import display
195
+ from lets_plot import *
196
+ from lets_plot.geo_data import *
197
+ LetsPlot.setup_html()
198
+ states = geocode_states().scope('UK').get_boundaries()
199
+ display(states)
200
+ ggplot() + \\
201
+ geom_map(aes(fill='found name'), data=states, color='white') + \\
202
+ ggtitle('UK States')
203
+
204
+ """
205
+ return NamesGeocoder('state', names)
206
+
207
+
208
+ def geocode_countries(names=None) -> NamesGeocoder:
209
+ """
210
+ Create a `NamesGeocoder <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html>`__ object for countries.
211
+ Allow to refine ambiguous request with `where() <https://lets-plot.org/python/pages/api/lets_plot.geo_data.NamesGeocoder.html#lets_plot.geo_data.NamesGeocoder.where>`__ method.
212
+
213
+ Parameters
214
+ ----------
215
+ names : str or list
216
+ Names of objects to be geocoded.
217
+
218
+ Returns
219
+ -------
220
+ ``NamesGeocoder``
221
+ Geocoder object specification.
222
+
223
+ Examples
224
+ --------
225
+ .. jupyter-execute::
226
+ :linenos:
227
+ :emphasize-lines: 5
228
+
229
+ from IPython.display import display
230
+ from lets_plot import *
231
+ from lets_plot.geo_data import *
232
+ LetsPlot.setup_html()
233
+ countries = geocode_countries(['Germany', 'Poland']).inc_res().get_boundaries()
234
+ display(countries)
235
+ ggplot() + geom_map(aes(fill='found name'), data=countries, color='white')
236
+
237
+ """
238
+ return NamesGeocoder('country', names)
239
+
240
+
241
+ def reverse_geocode(lon, lat, level=None, scope=None) -> ReverseGeocoder:
242
+ """
243
+ Convert a location as described by geographic coordinates to a ``ReverseGeocoder`` object.
244
+
245
+ Parameters
246
+ ----------
247
+ lon : float
248
+ Longitude coordinate of the geoobject.
249
+ lat : float
250
+ Latitude coordinate of the geoobject.
251
+ level : {'country', 'state', 'county', 'city'}
252
+ The level of administrative division.
253
+ scope : str or ``Geocoder``
254
+ Specify this for resolving conflicts for disputed territories.
255
+
256
+ Returns
257
+ -------
258
+ ``ReverseGeocoder``
259
+ Geocoder object specification.
260
+
261
+ Examples
262
+ --------
263
+ .. jupyter-execute::
264
+ :linenos:
265
+ :emphasize-lines: 5
266
+
267
+ from IPython.display import display
268
+ from lets_plot import *
269
+ from lets_plot.geo_data import *
270
+ LetsPlot.setup_html()
271
+ city = reverse_geocode(-73.87, 40.68, level='city').get_boundaries()
272
+ display(city)
273
+ ggplot() + geom_map(data=city) + ggtitle(city.iloc[0]['found name'])
274
+
275
+ """
276
+ return ReverseGeocoder(lon, lat, level, scope)
277
+
278
+
279
+ def distance(lon0, lat0, lon1, lat1, units='km'):
280
+ """
281
+ Calculate the distance between two points. Return result in kilometers or miles.
282
+
283
+ Parameters
284
+ ----------
285
+ lon0 : float
286
+ Longitude coordinate of the first point.
287
+ lat0 : float
288
+ Latitude coordinate of the first point.
289
+ lon1 : float
290
+ Longitude coordinate of the second point.
291
+ lat1 : float
292
+ Latitude coordinate of the second point.
293
+ units : {'mi', 'km'}, default='km'
294
+ The units in which the result will be obtained.
295
+ There are shorthands for values: 'mi' (miles), 'km' (kilometers).
296
+
297
+ Returns
298
+ -------
299
+ float
300
+ Distance between the points.
301
+
302
+ Examples
303
+ --------
304
+ .. jupyter-execute::
305
+ :linenos:
306
+ :emphasize-lines: 3
307
+
308
+ from lets_plot.geo_data import *
309
+ cities = geocode_cities(['New York', 'Chicago']).get_centroids().geometry
310
+ distance(cities[0].x, cities[0].y, cities[1].x, cities[1].y, units='mi')
311
+
312
+ """
313
+ return _calc_distance(lon0, lat0, lon1, lat1, units)
314
+
315
+
316
+ def _calc_distance(lon0, lat0, lon1, lat1, u):
317
+ r = _prepare_units(u)
318
+
319
+ lon0, lat0, lon1, lat1 = map(np.radians, [lon0, lat0, lon1, lat1])
320
+
321
+ dlon = lon1 - lon0
322
+ dlat = lat1 - lat0
323
+
324
+ a = np.sin(dlat / 2.0) ** 2 + np.cos(lat0) * np.cos(lat1) * np.sin(dlon / 2.0) ** 2
325
+
326
+ c = 2 * np.arcsin(np.sqrt(a))
327
+ return c * r
328
+
329
+
330
+ def _prepare_units(units: Any) -> float:
331
+ try:
332
+ return UNITS_DICT[units]
333
+ except KeyError:
334
+ raise ValueError('Wrong units: {}. The units can take the following values: '
335
+ 'mi (miles), km (kilometers).'.format(units))