newsworthycharts 1.74.2__py3-none-any.whl → 1.76.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.
@@ -1,4 +1,4 @@
1
- __version__ = "1.74.2"
1
+ __version__ = "1.76.0"
2
2
 
3
3
  from .chart import Chart
4
4
  from .choroplethmap import ChoroplethMap
@@ -33,6 +33,10 @@ class ChoroplethMap(Map):
33
33
 
34
34
  df = self._prepare_map_data()
35
35
 
36
+ missing_color = "gainsboro"
37
+ if self.missing_color:
38
+ missing_color = self.missing_color
39
+
36
40
  args = {
37
41
  "categorical": True,
38
42
  "legend": True, # bug in geopandas, fixed in master but not released
@@ -43,7 +47,7 @@ class ChoroplethMap(Map):
43
47
  "edgecolor": "white",
44
48
  "linewidth": 0.2,
45
49
  "missing_kwds": {
46
- "color": "gainsboro",
50
+ "color": missing_color,
47
51
  },
48
52
  }
49
53
  # This should be adjusted per basemap
@@ -58,8 +62,8 @@ class ChoroplethMap(Map):
58
62
  # normalize the data ourselves, otherwise the inset maps will be off
59
63
  norm = mpl.colors.Normalize(vmin=df["data"].min(), vmax=df["data"].max())
60
64
  mapper = mpl.cm.ScalarMappable(norm=norm, cmap=self.color_ramp)
61
- df["color"] = df["data"].apply(lambda x: mapper.to_rgba(x) if not np.isnan(x) else "gainsboro")
62
- df["color"] = df["color"].fillna("gainsboro")
65
+ df["color"] = df["data"].apply(lambda x: mapper.to_rgba(x) if not np.isnan(x) else missing_color)
66
+ df["color"] = df["color"].fillna(missing_color)
63
67
  args["color"] = df["color"]
64
68
 
65
69
  self._fig.tight_layout()
@@ -129,8 +133,8 @@ class ChoroplethMap(Map):
129
133
  # normalize the data ourselves, otherwise the inset maps will be off
130
134
  norm = mpl.colors.Normalize(vmin=_has_value["data"].min(), vmax=_has_value["data"].max())
131
135
  mapper = mpl.cm.ScalarMappable(norm=norm, cmap=self.color_ramp)
132
- df["color"] = df["data"].apply(lambda x: mapper.to_rgba(x) if not np.isnan(x) else "gainsboro")
133
- df["color"] = df["color"].fillna("gainsboro")
136
+ df["color"] = df["data"].apply(lambda x: mapper.to_rgba(x) if not np.isnan(x) else missing_color)
137
+ df["color"] = df["color"].fillna(missing_color)
134
138
  args["color"] = df["color"]
135
139
 
136
140
  # Add labels legend (manually, Geopandas is too crude as of now)
@@ -173,7 +177,7 @@ class ChoroplethMap(Map):
173
177
  for idx, cat in enumerate(cat):
174
178
  color_map[cat] = self._nwc_style["qualitative_colors"][idx]
175
179
  df["color"] = df["data"].astype(str).map(color_map)
176
- df["color"] = df["color"].fillna("gainsboro")
180
+ df["color"] = df["color"].fillna(missing_color)
177
181
  args["color"] = df["color"]
178
182
 
179
183
  # Geopandas does not handle legend if color keyword is used
@@ -195,7 +199,7 @@ class ChoroplethMap(Map):
195
199
  patches.append(patch)
196
200
  patches = list(reversed(patches))
197
201
  if self.missing_label and len(patches):
198
- patches.append(mpatches.Patch(color="gainsboro", label=self.missing_label))
202
+ patches.append(mpatches.Patch(color=missing_color, label=self.missing_label))
199
203
 
200
204
  df.plot(ax=self.ax, **args)
201
205
  # Add outer edge
@@ -231,8 +235,8 @@ class ChoroplethMap(Map):
231
235
  ax=axin,
232
236
  **args,
233
237
  )
234
- r, (a, b, c, d) = self.ax.indicate_inset_zoom(axin)
235
- for _line in [a, b, c, d]:
238
+ artist = self.ax.indicate_inset_zoom(axin)
239
+ for _line in artist.connectors:
236
240
  _line.set_visible(False)
237
241
 
238
242
  if len(patches):
@@ -75,13 +75,13 @@ def get_best_locator(delta, points, interval=None, max_ticks=None):
75
75
 
76
76
  elif interval == "weekly":
77
77
  # NB The threshold are not tested thoroughly. Consider adjusting.
78
- if delta.days <= 10 * 7:
78
+ if delta.days <= 9 * 7:
79
79
  return WeekdayLocator(MO, interval=1)
80
80
 
81
- elif delta.days <= 20 * 7:
81
+ elif delta.days <= 18 * 7:
82
82
  return WeekdayLocator(MO, interval=2)
83
83
 
84
- elif delta.days <= 30 * 7:
84
+ elif delta.days <= 27 * 7:
85
85
  return WeekdayLocator(MO, interval=3)
86
86
 
87
87
  else:
newsworthycharts/map.py CHANGED
@@ -94,6 +94,7 @@ class Map(Chart):
94
94
  self.categorical = kwargs.get("categorical", False)
95
95
  self.base_map = None
96
96
  self.missing_label = None
97
+ self.missing_color = None
97
98
  self.df = None
98
99
  self.show_ticks = False
99
100
 
@@ -253,7 +253,7 @@ class SerialChart(Chart):
253
253
  lm = "-"
254
254
  if lw is None:
255
255
  lw = self._nwc_style.get("lines.linewidth", 2)
256
-
256
+
257
257
  if hasattr(self, "_get_line_colors"):
258
258
  # Hook for sub classes
259
259
  color = self._get_line_colors(i)
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: newsworthycharts
3
- Version: 1.74.2
3
+ Version: 1.76.0
4
4
  Summary: Matplotlib wrapper to create charts and publish them on Amazon S3
5
5
  Home-page: https://github.com/jplusplus/newsworthycharts
6
- Download-URL: https://github.com/jplusplus/newsworthycharts/archive/1.74.2.tar.gz
6
+ Download-URL: https://github.com/jplusplus/newsworthycharts/archive/1.76.0.tar.gz
7
7
  Author: Jens Finnäs and Leo Wallentin, J++ Stockholm
8
8
  Author-email: stockholm@jplusplus.org
9
9
  License: MIT
10
- Requires-Python: >=3.9
10
+ Requires-Python: >=3.10
11
11
  Description-Content-Type: text/x-rst
12
12
  License-File: LICENSE.txt
13
13
  Requires-Dist: boto3>=1.26
@@ -18,11 +18,11 @@ Requires-Dist: PyYAML>=3
18
18
  Requires-Dist: adjustText==1.3.0
19
19
  Requires-Dist: numpy>2
20
20
  Requires-Dist: python-dateutil<3,>=2
21
- Requires-Dist: Pillow==11.2.1
21
+ Requires-Dist: Pillow==11.3.0
22
22
  Requires-Dist: requests>=2.22
23
23
  Requires-Dist: matplotlib-label-lines==0.5.1
24
- Requires-Dist: geopandas==1.0.1
25
- Requires-Dist: mapclassify==2.8.1
24
+ Requires-Dist: geopandas==1.1.1
25
+ Requires-Dist: mapclassify==2.10.0
26
26
  Dynamic: author
27
27
  Dynamic: author-email
28
28
  Dynamic: description
@@ -225,6 +225,7 @@ These settings are available for all chart types:
225
225
  - `categorical` = False # If True, the map will be colored by category. If False, it will be colored by a continuous value
226
226
  - `base_map` = None
227
227
  - `missing_label` = None # Add a label for no data
228
+ - `missing_color` = "gainsboro" # Color for regions with no data
228
229
 
229
230
  `basemap` can be `{ISO}-{level}` or `{ISO}|{subset}-{level}`.
230
231
  For example, `se-4` will show Swedish counties, while `se|03-7` will show municipalities (`se-7`) starting with `03`.
@@ -281,10 +282,22 @@ Roadmap
281
282
  - Remove custom charts (add missing api interfaces to Chart class instead)
282
283
  - Remove DataWrapper class (out-of-scope)
283
284
  - Custom month locator with equal-width month bars
285
+ - TODO: avif support
284
286
 
285
287
  Changelog
286
288
  ---------
287
289
 
290
+ - 1.76.0
291
+
292
+ - Pillow==11.3.0
293
+ - Minimum required Python version is now 3.10
294
+ - Minor fixes to weekly serial chart x axis
295
+
296
+ - 1.75.0
297
+
298
+ - geopandas==1.1.0
299
+ - Added `missing_color` argument to ChoroplethMap, to set the color of regions with no data
300
+
288
301
  - 1.74.2
289
302
 
290
303
  - Improved positioning of x-range annotations in SerialChart
@@ -1,15 +1,15 @@
1
- newsworthycharts/__init__.py,sha256=rzXGayG5WDpEr3V4WAe9kA0paK5FCLIDy8BDMpGK3is,1221
1
+ newsworthycharts/__init__.py,sha256=1Ot5ucxJ17wa-7yxakr0e-G-xpRHzFVw7mVYbMb8-18,1221
2
2
  newsworthycharts/bubblemap.py,sha256=nkocWmpiFgfjEuJGAsthjY5X7Q56jXWsZHUGXw4PwgE,2587
3
3
  newsworthycharts/categoricalchart.py,sha256=Vr-0yFms0hEVCeUa3vLt3FYBqpX4xLQ8YGPc4LGQN_A,18368
4
4
  newsworthycharts/chart.py,sha256=QDvIo_HV9fDmadBKLsPJMXrIYL6ZbHnDbVjZuzX9Srw,35441
5
- newsworthycharts/choroplethmap.py,sha256=eJiFcUpPFnkiF8VPiHTROdMuuRXHNX8_65rdowBskpc,9709
5
+ newsworthycharts/choroplethmap.py,sha256=3ztB8C0Pm9yUvPucnsRgmdPmnlCxvkiB42JuSOJmWSk,9834
6
6
  newsworthycharts/datawrapper.py,sha256=RRkAVTpfP4updKxUIBaSmKuBi2RUVPaBRF8HDQhlGGA,11250
7
- newsworthycharts/map.py,sha256=EGh96tU10y7Kgu1e83_VWQSeABdjP6V-0VM6VTHDxu4,6089
7
+ newsworthycharts/map.py,sha256=tECE7bZhJnvJxFV2pSitDxaHrKOwjBjoSA15H-MdzeI,6123
8
8
  newsworthycharts/rangeplot.py,sha256=NE1W9TnmlpK6T3RvBJOU3nd73EXqkj17OY9i5zlw_cQ,8366
9
9
  newsworthycharts/rankchart.py,sha256=vMzNMVOv1jae6wuHC_riAdb1lm9oPltO3TT3YQpc0Oc,9376
10
10
  newsworthycharts/scatterplot.py,sha256=weHubdMsDGaBTXejg2TqBNPTQ1K-QBpZqJiyQ8EOEc4,5084
11
11
  newsworthycharts/seasonalchart.py,sha256=ttT8JpvWB3DL0EcTBQor_Uxlow_6tdcl7ibEmLCpUrQ,1982
12
- newsworthycharts/serialchart.py,sha256=0soPp2hwCYNOv1c8iTBCkh6YwXlhTDqZlR5j4k3uh3Q,32079
12
+ newsworthycharts/serialchart.py,sha256=5tHj-UocgHRKKSwEclqcQjm9zPBlsOP_gt7D4O-gPns,32071
13
13
  newsworthycharts/storage.py,sha256=myERhlpvXyExXxUByBq9eW1bWkCyfH9SwTZbsWSyy3Q,4301
14
14
  newsworthycharts/stripechart.py,sha256=9B6PX2MyLuKNQ8W0OGdKbP0-U32kju0K_NHHwwz_J68,1547
15
15
  newsworthycharts/custom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -20,7 +20,7 @@ newsworthycharts/lib/colors.py,sha256=U04TDkvoMQkcldRFXfnwyLOTwq1SWW2se-Ad-DNcw9
20
20
  newsworthycharts/lib/datalist.py,sha256=-LdGFE0SOvjLnIRZ6eoJoijDaG3SeUPNIDPBjbm5A2U,6433
21
21
  newsworthycharts/lib/formatter.py,sha256=GNH43hE0bC17OgiV8LYH3YUrEhm7OJh9XzfSV4HVtHo,4838
22
22
  newsworthycharts/lib/geography.py,sha256=K0_teFmuPJwXX7Py-amJB_1YY5_gL2kBYhz1LrRCyTg,584
23
- newsworthycharts/lib/locator.py,sha256=oF4IbIofzDQsrVXM0WpQdLZMByL4B07pYYvuyVNANa0,3600
23
+ newsworthycharts/lib/locator.py,sha256=M0TsMWYQF9i5Rnw4Ortjyv6OltPjXDJifxR1NtEe-TY,3599
24
24
  newsworthycharts/lib/mimetypes.py,sha256=bL9HtVWbn2Of39LcBt4u4yelkr4bGZiyebq3OfLnfFY,237
25
25
  newsworthycharts/lib/utils.py,sha256=zk2hfbZluRcwwxa-N9LocP65HKiHmvgkBw9saAq1lgU,7403
26
26
  newsworthycharts/maps/se-4.gpkg,sha256=oWw5j7FPVpI0ig67jNDim8qSn5SG8rcHp0014-uTKZM,290816
@@ -29,8 +29,8 @@ newsworthycharts/rc/newsworthy,sha256=yOIZvYS6PG1u19VMcdtfj9vbihKQsey5IprwqK59Kg
29
29
  newsworthycharts/translations/datawrapper_regions.csv,sha256=fzZcQRX6RFMlNNP8mpgfYNdR3Y0QAlQxDXk8FXTaWWI,9214
30
30
  newsworthycharts/translations/regions.py,sha256=Nv1McQjggD4S3JRu82rDMTG3pqUVR13E5-FBpSYbm98,239
31
31
  newsworthycharts/translations/se_municipalities.csv,sha256=br_mm-IvzQtj_W55_ATREhJ97jWnCweBFlDAVY2EBxA,7098
32
- newsworthycharts-1.74.2.dist-info/licenses/LICENSE.txt,sha256=Sq6kGICrehbhC_FolNdXf0djKjTpv3YqjFCIYsxdQN4,1069
33
- newsworthycharts-1.74.2.dist-info/METADATA,sha256=-VsTp67U9vXLQx9pUYIwGtVlwGnjqyD8UIIeffC5pcw,35358
34
- newsworthycharts-1.74.2.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
35
- newsworthycharts-1.74.2.dist-info/top_level.txt,sha256=dn_kzIj8UgUCMsh1PHdVEQJHVGSsN7Z8YJF-8xXa8n0,17
36
- newsworthycharts-1.74.2.dist-info/RECORD,,
32
+ newsworthycharts-1.76.0.dist-info/licenses/LICENSE.txt,sha256=Sq6kGICrehbhC_FolNdXf0djKjTpv3YqjFCIYsxdQN4,1069
33
+ newsworthycharts-1.76.0.dist-info/METADATA,sha256=Cl5xD_75FXkccbJ5s_2rVX-KmC1gqlnhpIChH70q6h4,35699
34
+ newsworthycharts-1.76.0.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
35
+ newsworthycharts-1.76.0.dist-info/top_level.txt,sha256=dn_kzIj8UgUCMsh1PHdVEQJHVGSsN7Z8YJF-8xXa8n0,17
36
+ newsworthycharts-1.76.0.dist-info/RECORD,,