@@ -870,10 +870,10 @@ def legend_elements(self, variable_name='x', str_format=str):
870
870
lower = str_format (lower )
871
871
upper = str_format (upper )
872
872
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 , ))
877
877
else :
878
878
labels .append (r'$%s < %s \leq %s$' % (lower , variable_name , upper ))
879
879
else :
@@ -1029,24 +1029,25 @@ def _contour_level_args(self, z, args):
1029
1029
raise ValueError ("Filled contours require at least 2 levels." )
1030
1030
1031
1031
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.
1032
1036
self ._levels = list (self .levels )
1033
1037
if self .extend in ('both' , 'min' ):
1034
1038
self ._levels .insert (0 , min (self .levels [0 ],self .zmin ) - 1 )
1035
1039
if self .extend in ('both' , 'max' ):
1036
1040
self ._levels .append (max (self .levels [- 1 ],self .zmax ) + 1 )
1037
1041
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 ]
1044
1042
if self .filled :
1043
+ # layer values are mid-way between levels
1045
1044
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:
1046
1047
if self .extend in ('both' , 'min' ):
1047
- self .layers [0 ] = 0.5 * ( self . vmin + self . _levels [ 1 ])
1048
+ self .layers [0 ] = - 1e300
1048
1049
if self .extend in ('both' , 'max' ):
1049
- self .layers [- 1 ] = 0.5 * ( self . vmax + self . _levels [ - 2 ])
1050
+ self .layers [- 1 ] = 1e300
1050
1051
else :
1051
1052
self .layers = self .levels # contour: a line is a thin layer
1052
1053
# Use only original levels--no extended levels
@@ -1065,9 +1066,11 @@ def _process_colors(self):
1065
1066
"""
1066
1067
self .monochrome = self .cmap .monochrome
1067
1068
if self .colors is not None :
1069
+ # Generate integers for direct indexing.
1068
1070
i0 , i1 = 0 , len (self .levels )
1069
1071
if self .filled :
1070
1072
i1 -= 1
1073
+ # Out of range indices for over and under:
1071
1074
if self .extend in ('both' , 'min' ):
1072
1075
i0 = - 1
1073
1076
if self .extend in ('both' , 'max' ):
@@ -1080,7 +1083,8 @@ def _process_colors(self):
1080
1083
self .set_clim (self .vmin , self .vmax )
1081
1084
if self .extend in ('both' , 'max' , 'min' ):
1082
1085
self .norm .clip = False
1083
- self .set_array (self .layers )
1086
+ self .set_array (self .layers ) # Required by colorbar, but not
1087
+ # actually used.
1084
1088
# self.tcolors are set by the "changed" method
1085
1089
1086
1090
def _process_linewidths (self ):
0 commit comments