newsworthycharts 1.71.4__tar.gz → 1.72.0__tar.gz

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.
Files changed (52) hide show
  1. {newsworthycharts-1.71.4/newsworthycharts.egg-info → newsworthycharts-1.72.0}/PKG-INFO +19 -3
  2. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/README.rst +16 -0
  3. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/__init__.py +1 -1
  4. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/choroplethmap.py +31 -2
  5. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/map.py +1 -0
  6. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/rankchart.py +85 -20
  7. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/serialchart.py +5 -2
  8. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0/newsworthycharts.egg-info}/PKG-INFO +19 -3
  9. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts.egg-info/requires.txt +1 -1
  10. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/setup.py +1 -1
  11. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/LICENSE.txt +0 -0
  12. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/MANIFEST.in +0 -0
  13. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/bubblemap.py +0 -0
  14. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/categoricalchart.py +0 -0
  15. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/chart.py +0 -0
  16. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/custom/__init__.py +0 -0
  17. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/custom/climate_cars.py +0 -0
  18. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/datawrapper.py +0 -0
  19. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/__init__.py +0 -0
  20. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/color_fn.py +0 -0
  21. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/colors.py +0 -0
  22. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/datalist.py +0 -0
  23. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/formatter.py +0 -0
  24. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/geography.py +0 -0
  25. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/locator.py +0 -0
  26. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/mimetypes.py +0 -0
  27. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/lib/utils.py +0 -0
  28. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/maps/se-4.gpkg +0 -0
  29. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/maps/se-7.gpkg +0 -0
  30. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/rangeplot.py +0 -0
  31. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/rc/newsworthy +0 -0
  32. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/scatterplot.py +0 -0
  33. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/seasonalchart.py +0 -0
  34. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/storage.py +0 -0
  35. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/stripechart.py +0 -0
  36. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/translations/datawrapper_regions.csv +0 -0
  37. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/translations/regions.py +0 -0
  38. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts/translations/se_municipalities.csv +0 -0
  39. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts.egg-info/SOURCES.txt +0 -0
  40. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts.egg-info/dependency_links.txt +0 -0
  41. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts.egg-info/not-zip-safe +0 -0
  42. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/newsworthycharts.egg-info/top_level.txt +0 -0
  43. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/setup.cfg +0 -0
  44. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_categorical_chart.py +0 -0
  45. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_choropleth_maps.py +0 -0
  46. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_custom_climate_cars.py +0 -0
  47. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_data_list.py +0 -0
  48. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_datawrapper.py +0 -0
  49. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_main.py +0 -0
  50. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_rangeplot.py +0 -0
  51. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_scatterplot.py +0 -0
  52. {newsworthycharts-1.71.4 → newsworthycharts-1.72.0}/test/test_serial_chart.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: newsworthycharts
3
- Version: 1.71.4
3
+ Version: 1.72.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.71.4.tar.gz
6
+ Download-URL: https://github.com/jplusplus/newsworthycharts/archive/1.72.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
@@ -11,7 +11,7 @@ Requires-Python: >=3.9
11
11
  Description-Content-Type: text/x-rst
12
12
  License-File: LICENSE.txt
13
13
  Requires-Dist: boto3>=1.26
14
- Requires-Dist: matplotlib==3.10.0
14
+ Requires-Dist: matplotlib==3.10.1
15
15
  Requires-Dist: langcodes>=3.3
16
16
  Requires-Dist: Babel<3,>=2.14.0
17
17
  Requires-Dist: PyYAML>=3
@@ -179,6 +179,7 @@ _ Inherits from SerialChart _
179
179
 
180
180
  _ Inherits from SerialChart _
181
181
 
182
+ - label_placement = "right" # [left|right|both|outside|legend]
182
183
  - highlight = None # The label value to of a line to highlight
183
184
  - line_marker = "o-" # Matplotlib line marker type.
184
185
  - line_marker_size = 5 # Matplotlib line marker size
@@ -270,6 +271,21 @@ Roadmap
270
271
  Changelog
271
272
  ---------
272
273
 
274
+ - 1.72.0
275
+
276
+ - Use gradient legend för continuous choropleth maps
277
+ - Don't add None value to legend if it is empty in ChoroplethMap
278
+ - Fixed zorder bug in SerialChart with baseline annotations and bars
279
+ - matplotlib==3.10.1
280
+ - Fixed a bug where choropleth maps would break on svery small numbers (by bypassing all axis formatting logic for maps).
281
+ This should also speed up rendering of maps somewhat.
282
+
283
+ - 1.71.5
284
+
285
+ - zorder fixes in BumpChart
286
+ - Add `label_placement` = [left|right|both|outside|legend] to BumpChart. Default is 'right'
287
+ - Use alternating shades of gray in BumpChart
288
+
273
289
  - 1.71.4
274
290
 
275
291
  - BumpChart: Use dual colors in line markers when rank is shared
@@ -153,6 +153,7 @@ _ Inherits from SerialChart _
153
153
 
154
154
  _ Inherits from SerialChart _
155
155
 
156
+ - label_placement = "right" # [left|right|both|outside|legend]
156
157
  - highlight = None # The label value to of a line to highlight
157
158
  - line_marker = "o-" # Matplotlib line marker type.
158
159
  - line_marker_size = 5 # Matplotlib line marker size
@@ -244,6 +245,21 @@ Roadmap
244
245
  Changelog
245
246
  ---------
246
247
 
248
+ - 1.72.0
249
+
250
+ - Use gradient legend för continuous choropleth maps
251
+ - Don't add None value to legend if it is empty in ChoroplethMap
252
+ - Fixed zorder bug in SerialChart with baseline annotations and bars
253
+ - matplotlib==3.10.1
254
+ - Fixed a bug where choropleth maps would break on svery small numbers (by bypassing all axis formatting logic for maps).
255
+ This should also speed up rendering of maps somewhat.
256
+
257
+ - 1.71.5
258
+
259
+ - zorder fixes in BumpChart
260
+ - Add `label_placement` = [left|right|both|outside|legend] to BumpChart. Default is 'right'
261
+ - Use alternating shades of gray in BumpChart
262
+
247
263
  - 1.71.4
248
264
 
249
265
  - BumpChart: Use dual colors in line markers when rank is shared
@@ -1,4 +1,4 @@
1
- __version__ = "1.71.4"
1
+ __version__ = "1.72.0"
2
2
 
3
3
  from .chart import Chart
4
4
  from .choroplethmap import ChoroplethMap
@@ -8,6 +8,7 @@ import pandas as pd
8
8
  import mapclassify
9
9
  import matplotlib as mpl
10
10
  import matplotlib.patches as mpatches
11
+ from mpl_toolkits.axes_grid1.inset_locator import inset_axes
11
12
 
12
13
 
13
14
  class ChoroplethMap(Map):
@@ -61,6 +62,32 @@ class ChoroplethMap(Map):
61
62
  df["color"] = df["color"].fillna("gainsboro")
62
63
  args["color"] = df["color"]
63
64
 
65
+ self._fig.tight_layout()
66
+ fmt = self._get_value_axis_formatter()
67
+ cax = inset_axes(
68
+ self.ax,
69
+ width=0.1,
70
+ height=2, # 2 tum = 200 px vid 100 dpi
71
+ loc='upper right',
72
+ borderpad=0.1,
73
+ # formatter
74
+ )
75
+ cb = self._fig.colorbar(
76
+ mapper,
77
+ cax=cax,
78
+ format=mpl.ticker.FuncFormatter(fmt),
79
+ drawedges=False,
80
+ shrink=0.9,
81
+ # use_gridspec=False,
82
+ # pad=0.1,
83
+ )
84
+ # args["legend_kwds"]["pad"] = 0.15
85
+ # args["legend_kwds"]["location"] = "left"
86
+
87
+ if self.legend_title:
88
+ cb.set_label(self.legend_title)
89
+ self.legend_title = None
90
+ """
64
91
  _min = df["data"].min()
65
92
  _max = df["data"].max()
66
93
  _median = df["data"].median()
@@ -70,6 +97,7 @@ class ChoroplethMap(Map):
70
97
  patches.append(mpatches.Patch(color=mapper.to_rgba(_median), label=fmt(_median)))
71
98
  if _max != _min:
72
99
  patches.append(mpatches.Patch(color=mapper.to_rgba(_max), label=fmt(_max)))
100
+ """
73
101
 
74
102
  elif not self.categorical:
75
103
  # mapclassify doesn't work well with nan values,
@@ -99,7 +127,7 @@ class ChoroplethMap(Map):
99
127
  # args["cmap"] = self.color_ramp
100
128
  # We can not provide vmin/vmax to geopandas, so we need to
101
129
  # normalize the data ourselves, otherwise the inset maps will be off
102
- norm = mpl.colors.Normalize(vmin=df["data"].min(), vmax=df["data"].max())
130
+ norm = mpl.colors.Normalize(vmin=_has_value["data"].min(), vmax=_has_value["data"].max())
103
131
  mapper = mpl.cm.ScalarMappable(norm=norm, cmap=self.color_ramp)
104
132
  df["color"] = df["data"].apply(lambda x: mapper.to_rgba(x) if not np.isnan(x) else "gainsboro")
105
133
  df["color"] = df["color"].fillna("gainsboro")
@@ -155,7 +183,7 @@ class ChoroplethMap(Map):
155
183
  patch = mpatches.Patch(color=color, label=label)
156
184
  patches.append(patch)
157
185
  patches = list(reversed(patches))
158
- if self.missing_label:
186
+ if self.missing_label and len(patches):
159
187
  patches.append(mpatches.Patch(color="gainsboro", label=self.missing_label))
160
188
 
161
189
  df.plot(ax=self.ax, **args)
@@ -201,3 +229,4 @@ class ChoroplethMap(Map):
201
229
  handles=patches,
202
230
  **label_kwargs,
203
231
  )
232
+ #self.ax.get_figure().savefig("TST.png", bbox_inches="tight")
@@ -95,6 +95,7 @@ class Map(Chart):
95
95
  self.base_map = None
96
96
  self.missing_label = None
97
97
  self.df = None
98
+ self.show_ticks = False
98
99
 
99
100
  def _normalize_region_code(self, code):
100
101
  code = code.upper().replace("_", "-")
@@ -15,13 +15,18 @@ class BumpChart(SerialChart):
15
15
  """
16
16
 
17
17
  def __init__(self, *args, **kwargs):
18
+ label_placement = kwargs.get("label_placement", None)
19
+ if label_placement not in ["legend", "outside"]:
20
+ self.label_placement = "none"
21
+
18
22
  super(BumpChart, self).__init__(*args, **kwargs)
19
23
 
20
24
  if self.line_width is None:
21
25
  self.line_width = 0.9
22
26
  if self.line_marker_size is None:
23
27
  self.line_marker_size = 6
24
- self.label_placement = 'none'
28
+ if not label_placement:
29
+ self.label_placement = 'right'
25
30
  self.type = "line"
26
31
  self.decimals = 0
27
32
  self.revert_value_axis = True
@@ -40,7 +45,11 @@ class BumpChart(SerialChart):
40
45
  return self._nwc_style["strong_color"]
41
46
  elif self.colors and i < len(self.colors):
42
47
  return self.colors[i]
43
- return self._nwc_style["neutral_color"]
48
+ # alternate between dark gray and light gray
49
+ if i % 2 == 0:
50
+ return "darkgray"
51
+ else:
52
+ return "lightgray"
44
53
 
45
54
  """
46
55
  def _get_marker_fill(self, i):
@@ -55,7 +64,6 @@ class BumpChart(SerialChart):
55
64
 
56
65
  # Recolor markers with more than one line passing through
57
66
  # (MPL does not allow access to individual markers, so we'll overwrite them)
58
-
59
67
  for date in self.data.x_points:
60
68
  value_colors = {}
61
69
  for i, serie in enumerate(self.data):
@@ -98,7 +106,10 @@ class BumpChart(SerialChart):
98
106
  zorder=100,
99
107
  )
100
108
  # Add labels
101
- slots_occupied = {
109
+ slots_occupied_right = {
110
+ to_date(k): [] for k in self.data.x_points
111
+ }
112
+ slots_occupied_left = {
102
113
  to_date(k): [] for k in self.data.x_points
103
114
  }
104
115
  # distance between rank ticks
@@ -114,23 +125,77 @@ class BumpChart(SerialChart):
114
125
  (d, values[idx])
115
126
  for (idx, d) in enumerate(dates) if idx == len(dates) - 1 or np.isnan(values[idx + 1])
116
127
  ]
117
- for ep in endpoints:
118
- position = ep[1]
119
- while position in slots_occupied[ep[0]]:
120
- position += 1
121
- # pos_diff = position - ep[1]
122
- slots_occupied[ep[0]].append(position)
123
- self._annotate_point(
124
- self.labels[i],
125
- # (ep[0], ep[1]),
126
- (ep[0], position),
127
- "right",
128
- offset=15,
129
- color=color,
130
- va="center",
131
- # xytext=(15, -abs(y1[1] - y2[1]) * pos_diff),
132
- # arrowprops=dict(arrowstyle="->", color=color) if pos_diff > 1 else None,
128
+
129
+ startpoints = []
130
+ if self.label_placement == "both":
131
+ startpoints = [
132
+ (d, values[idx])
133
+ for (idx, d) in enumerate(dates)
134
+ if (idx == 0 or np.isnan(values[idx - 1]) # only if 2 consecutive values come after
135
+ and (idx < len(dates) - 2)
136
+ and not np.isnan(values[idx + 1])
137
+ and not np.isnan(values[idx + 2]))
138
+ ]
139
+ elif self.label_placement == "left":
140
+ startpoints = [
141
+ (d, values[idx])
142
+ for (idx, d) in enumerate(dates)
143
+ if idx == 0 or np.isnan(values[idx - 1])
144
+ ]
145
+
146
+ if self.label_placement in ["left", "both"]:
147
+ # We need to move y spine to the left to make room for labels
148
+ # To save time we'll only measure the with of the longest text string
149
+ # There will be edge cases where shorter strings taker up more space
150
+ longest_sp_label = max([len(str(x[1])) for x in startpoints])
151
+ dummy_text = self.ax.text(
152
+ 0, 0,
153
+ longest_sp_label,
154
+ fontsize=self._nwc_style["annotation.fontsize"]
155
+ )
156
+ _bbox = dummy_text.get_window_extent(renderer=self._fig.canvas.get_renderer())
157
+ self.ax.spines['left'].set_position(
158
+ ('outward', _bbox.width * 1.15 + 15)
133
159
  )
160
+ dummy_text.remove()
161
+
162
+ if self.label_placement in ["right", "both"]:
163
+ for ep in endpoints:
164
+ position = ep[1]
165
+ while position in slots_occupied_right[ep[0]]:
166
+ position += 1
167
+ # pos_diff = position - ep[1]
168
+ slots_occupied_right[ep[0]].append(position)
169
+ self._annotate_point(
170
+ self.labels[i],
171
+ # (ep[0], ep[1]),
172
+ (ep[0], position),
173
+ "right",
174
+ offset=15,
175
+ color=color,
176
+ va="center",
177
+ # xytext=(15, -abs(y1[1] - y2[1]) * pos_diff),
178
+ # arrowprops=dict(arrowstyle="->", color=color) if pos_diff > 1 else None,
179
+ zorder=99,
180
+ )
181
+ if self.label_placement in ["left", "both"]:
182
+ for sp in startpoints:
183
+ position = sp[1]
184
+ while position in slots_occupied_left[sp[0]]:
185
+ position += 1
186
+ # pos_diff = position - sp[1]
187
+ slots_occupied_left[sp[0]].append(position)
188
+ self._annotate_point(
189
+ self.labels[i],
190
+ (sp[0], position),
191
+ "left",
192
+ offset=15,
193
+ color=color,
194
+ va="center",
195
+ zorder=99,
196
+ )
197
+ # Add space for labels on the left
198
+
134
199
  """
135
200
  labels = []
136
201
  for i, serie in enumerate(self.data):
@@ -52,7 +52,9 @@ class SerialChart(Chart):
52
52
  self.colors = None
53
53
 
54
54
  # Optional: where to place series label
55
- self.label_placement = "legend" # legend|inline|outside|line
55
+ # Could be set already by subclass
56
+ if not hasattr(self, "label_placement"):
57
+ self.label_placement = "legend" # legend|inline|outside|line
56
58
 
57
59
  # Optional: annotate each point with a value label
58
60
  self.value_labels = False
@@ -518,7 +520,7 @@ class SerialChart(Chart):
518
520
  linewidth=1,
519
521
  color="#444444",
520
522
  zorder=11,
521
- linestyle="--" if self.baseline else "-"
523
+ linestyle="--" if self.baseline else "-",
522
524
  )
523
525
  if self.baseline_annotation:
524
526
  xy = (to_date(self.data.outer_min_x), self.baseline)
@@ -529,6 +531,7 @@ class SerialChart(Chart):
529
531
  xy,
530
532
  direction="down" if first_val and first_val >= self.baseline else "up",
531
533
  color=self._nwc_style["neutral_color"],
534
+ zorder=11,
532
535
  )
533
536
 
534
537
  # Shade area between lines if there are exactly 2 series
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: newsworthycharts
3
- Version: 1.71.4
3
+ Version: 1.72.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.71.4.tar.gz
6
+ Download-URL: https://github.com/jplusplus/newsworthycharts/archive/1.72.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
@@ -11,7 +11,7 @@ Requires-Python: >=3.9
11
11
  Description-Content-Type: text/x-rst
12
12
  License-File: LICENSE.txt
13
13
  Requires-Dist: boto3>=1.26
14
- Requires-Dist: matplotlib==3.10.0
14
+ Requires-Dist: matplotlib==3.10.1
15
15
  Requires-Dist: langcodes>=3.3
16
16
  Requires-Dist: Babel<3,>=2.14.0
17
17
  Requires-Dist: PyYAML>=3
@@ -179,6 +179,7 @@ _ Inherits from SerialChart _
179
179
 
180
180
  _ Inherits from SerialChart _
181
181
 
182
+ - label_placement = "right" # [left|right|both|outside|legend]
182
183
  - highlight = None # The label value to of a line to highlight
183
184
  - line_marker = "o-" # Matplotlib line marker type.
184
185
  - line_marker_size = 5 # Matplotlib line marker size
@@ -270,6 +271,21 @@ Roadmap
270
271
  Changelog
271
272
  ---------
272
273
 
274
+ - 1.72.0
275
+
276
+ - Use gradient legend för continuous choropleth maps
277
+ - Don't add None value to legend if it is empty in ChoroplethMap
278
+ - Fixed zorder bug in SerialChart with baseline annotations and bars
279
+ - matplotlib==3.10.1
280
+ - Fixed a bug where choropleth maps would break on svery small numbers (by bypassing all axis formatting logic for maps).
281
+ This should also speed up rendering of maps somewhat.
282
+
283
+ - 1.71.5
284
+
285
+ - zorder fixes in BumpChart
286
+ - Add `label_placement` = [left|right|both|outside|legend] to BumpChart. Default is 'right'
287
+ - Use alternating shades of gray in BumpChart
288
+
273
289
  - 1.71.4
274
290
 
275
291
  - BumpChart: Use dual colors in line markers when rank is shared
@@ -1,5 +1,5 @@
1
1
  boto3>=1.26
2
- matplotlib==3.10.0
2
+ matplotlib==3.10.1
3
3
  langcodes>=3.3
4
4
  Babel<3,>=2.14.0
5
5
  PyYAML>=3
@@ -25,7 +25,7 @@ setup(
25
25
  python_requires='>=3.9',
26
26
  install_requires=[
27
27
  "boto3>=1.26",
28
- "matplotlib==3.10.0",
28
+ "matplotlib==3.10.1",
29
29
  "langcodes>=3.3",
30
30
  "Babel>=2.14.0,<3",
31
31
  "PyYAML>=3",