Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 44d7556

Browse files
committed
contour: map extended ranges to "under" and "over" values
Contourf was handling the extend kwarg by mapping the extended ranges directly into the 0-1 normal colormap range, so that using set_under and set_over had no effect. The legend support for extend options was also using the wrong names for the options.
1 parent 408c529 commit 44d7556

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

lib/matplotlib/contour.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -870,10 +870,10 @@ def legend_elements(self, variable_name='x', str_format=str):
870870
lower = str_format(lower)
871871
upper = str_format(upper)
872872

873-
if i == 0 and self.extend in ('lower', 'both'):
874-
labels.append(r'$%s \leq %s$' % (variable_name, upper, ))
875-
elif i == n_levels-1 and self.extend in ('upper', 'both'):
876-
labels.append(r'$%s > %s$' % (variable_name, lower, ))
873+
if i == 0 and self.extend in ('min', 'both'):
874+
labels.append(r'$%s \leq %s$' % (variable_name, lower, ))
875+
elif i == n_levels-1 and self.extend in ('max', 'both'):
876+
labels.append(r'$%s > %s$' % (variable_name, upper, ))
877877
else:
878878
labels.append(r'$%s < %s \leq %s$' % (lower, variable_name, upper))
879879
else:
@@ -1029,24 +1029,25 @@ def _contour_level_args(self, z, args):
10291029
raise ValueError("Filled contours require at least 2 levels.")
10301030

10311031
def _process_levels(self):
1032+
# Color mapping range (norm vmin, vmax) is based on levels.
1033+
self.vmin = np.amin(self.levels)
1034+
self.vmax = np.amax(self.levels)
1035+
# Make a private _levels to include extended regions.
10321036
self._levels = list(self.levels)
10331037
if self.extend in ('both', 'min'):
10341038
self._levels.insert(0, min(self.levels[0],self.zmin) - 1)
10351039
if self.extend in ('both', 'max'):
10361040
self._levels.append(max(self.levels[-1],self.zmax) + 1)
10371041
self._levels = np.asarray(self._levels)
1038-
self.vmin = np.amin(self.levels) # alternative would be self.layers
1039-
self.vmax = np.amax(self.levels)
1040-
if self.extend in ('both', 'min'):
1041-
self.vmin = 2 * self.levels[0] - self.levels[1]
1042-
if self.extend in ('both', 'max'):
1043-
self.vmax = 2 * self.levels[-1] - self.levels[-2]
10441042
if self.filled:
1043+
# layer values are mid-way between levels
10451044
self.layers = 0.5 * (self._levels[:-1] + self._levels[1:])
1045+
# ...except that extended layers must be outside the
1046+
# normed range, so use huge values:
10461047
if self.extend in ('both', 'min'):
1047-
self.layers[0] = 0.5 * (self.vmin + self._levels[1])
1048+
self.layers[0] = -1e300
10481049
if self.extend in ('both', 'max'):
1049-
self.layers[-1] = 0.5 * (self.vmax + self._levels[-2])
1050+
self.layers[-1] = 1e300
10501051
else:
10511052
self.layers = self.levels # contour: a line is a thin layer
10521053
# Use only original levels--no extended levels
@@ -1065,9 +1066,11 @@ def _process_colors(self):
10651066
"""
10661067
self.monochrome = self.cmap.monochrome
10671068
if self.colors is not None:
1069+
# Generate integers for direct indexing.
10681070
i0, i1 = 0, len(self.levels)
10691071
if self.filled:
10701072
i1 -= 1
1073+
# Out of range indices for over and under:
10711074
if self.extend in ('both', 'min'):
10721075
i0 = -1
10731076
if self.extend in ('both', 'max'):
@@ -1080,7 +1083,8 @@ def _process_colors(self):
10801083
self.set_clim(self.vmin, self.vmax)
10811084
if self.extend in ('both', 'max', 'min'):
10821085
self.norm.clip = False
1083-
self.set_array(self.layers)
1086+
self.set_array(self.layers) # Required by colorbar, but not
1087+
# actually used.
10841088
# self.tcolors are set by the "changed" method
10851089

10861090
def _process_linewidths(self):

0 commit comments

Comments
 (0)