3
3
SkewT-logP diagram: using transforms and custom projections
4
4
===========================================================
5
5
6
- This serves as an intensive exercise of matplotlib 's transforms and custom
6
+ This serves as an intensive exercise of Matplotlib 's transforms and custom
7
7
projection API. This example produces a so-called SkewT-logP diagram, which is
8
8
a common plot in meteorology for displaying vertical profiles of temperature.
9
- As far as matplotlib is concerned, the complexity comes from having X and Y
9
+ As far as Matplotlib is concerned, the complexity comes from having X and Y
10
10
axes that are not orthogonal. This is handled by including a skew component to
11
11
the basic Axes transforms. Additional complexity comes in handling the fact
12
12
that the upper and lower X-axes have different data ranges, which necessitates
13
13
a bunch of custom classes for ticks, spines, and axis to handle this.
14
-
15
14
"""
16
15
17
16
from contextlib import ExitStack
@@ -108,25 +107,30 @@ def _set_lim_and_transforms(self):
108
107
rot = 30
109
108
110
109
# Get the standard transform setup from the Axes base class
111
- Axes ._set_lim_and_transforms (self )
110
+ super () ._set_lim_and_transforms ()
112
111
113
112
# Need to put the skew in the middle, after the scale and limits,
114
113
# but before the transAxes. This way, the skew is done in Axes
115
114
# coordinates thus performing the transform around the proper origin
116
115
# We keep the pre-transAxes transform around for other users, like the
117
116
# spines for finding bounds
118
- self .transDataToAxes = self .transScale + \
119
- self .transLimits + transforms .Affine2D ().skew_deg (rot , 0 )
120
-
117
+ self .transDataToAxes = (
118
+ self .transScale
119
+ + self .transLimits
120
+ + transforms .Affine2D ().skew_deg (rot , 0 )
121
+ )
121
122
# Create the full transform from Data to Pixels
122
123
self .transData = self .transDataToAxes + self .transAxes
123
124
124
125
# Blended transforms like this need to have the skewing applied using
125
126
# both axes, in axes coords like before.
126
- self ._xaxis_transform = (transforms .blended_transform_factory (
127
- self .transScale + self .transLimits ,
128
- transforms .IdentityTransform ()) +
129
- transforms .Affine2D ().skew_deg (rot , 0 )) + self .transAxes
127
+ self ._xaxis_transform = (
128
+ transforms .blended_transform_factory (
129
+ self .transScale + self .transLimits ,
130
+ transforms .IdentityTransform ())
131
+ + transforms .Affine2D ().skew_deg (rot , 0 )
132
+ + self .transAxes
133
+ )
130
134
131
135
@property
132
136
def lower_xlim (self ):
@@ -138,8 +142,7 @@ def upper_xlim(self):
138
142
return self .transDataToAxes .inverted ().transform (pts )[:, 0 ]
139
143
140
144
141
- # Now register the projection with matplotlib so the user can select
142
- # it.
145
+ # Now register the projection with matplotlib so the user can select it.
143
146
register_projection (SkewXAxes )
144
147
145
148
if __name__ == '__main__' :
@@ -150,86 +153,86 @@ def upper_xlim(self):
150
153
import matplotlib .pyplot as plt
151
154
import numpy as np
152
155
153
- # Some examples data
156
+ # Some example data.
154
157
data_txt = '''
155
- 978.0 345 7.8 0.8 61 4.16 325 14 282.7 294.6 283.4
156
- 971.0 404 7.2 0.2 61 4.01 327 17 282.7 294.2 283.4
157
- 946.7 610 5.2 -1.8 61 3.56 335 26 282.8 293.0 283.4
158
- 944.0 634 5.0 -2.0 61 3.51 336 27 282.8 292.9 283.4
159
- 925.0 798 3.4 -2.6 65 3.43 340 32 282.8 292.7 283.4
160
- 911.8 914 2.4 -2.7 69 3.46 345 37 282.9 292.9 283.5
161
- 906.0 966 2 .0 -2.7 71 3.47 348 39 283. 0 293.0 283.6
162
- 877.9 1219 0.4 -3.2 77 3.46 0 48 283.9 293.9 284.5
163
- 850.0 1478 -1.3 -3.7 84 3.44 0 47 284.8 294.8 285.4
164
- 841.0 1563 -1.9 -3.8 87 3.45 358 45 285.0 295.0 285.6
165
- 823.0 1736 1.4 -0.7 86 4.44 353 42 290.3 303.3 291.0
166
- 813.6 1829 4.5 1.2 80 5.17 350 40 294. 5 309.8 295.4
167
- 809.0 1875 6 .0 2.2 77 5.57 347 39 296.6 313.2 297.6
168
- 798.0 1988 7.4 -0.6 57 4.61 340 35 299.2 313.3 300.1
169
- 791.0 2061 7.6 -1.4 53 4.39 335 33 300.2 313.6 301.0
170
- 783.9 2134 7.0 -1.7 54 4.32 330 31 300.4 313.6 301.2
171
- 755.1 2438 4.8 -3. 1 57 4.06 300 24 301.2 313.7 301.9
172
- 727.3 2743 2.5 -4.4 60 3.81 285 29 301.9 313.8 302.6
173
- 700.5 3048 0.2 -5.8 64 3.57 275 31 302.7 313.8 303.3
174
- 700.0 3054 0.2 -5.8 64 3.56 280 31 302.7 313.8 303.3
175
- 698.0 3077 0.0 -6.0 64 3.52 280 31 302.7 313.7 303.4
176
- 687.0 3204 -0.1 -7.1 59 3.28 281 31 304.0 314.3 304.6
177
- 648.9 3658 -3.2 -10.9 55 2.59 285 30 305.5 313.8 305 .9
178
- 631.0 3881 -4.7 -12.7 54 2.29 289 33 306.2 313.6 306.6
179
- 600.7 4267 -6.4 -16.7 44 1.73 295 39 308.6 314.3 308.9
180
- 592.0 4381 -6.9 -17.9 41 1.59 297 41 309.3 314.6 309.6
181
- 577.6 4572 -8.1 -19.6 39 1.41 300 44 310.1 314.9 310.3
182
- 555.3 4877 -10.0 -22.3 36 1.16 295 39 311.3 315.3 311.5
183
- 536.0 5151 -11.7 -24.7 33 0.97 304 39 312.4 315.8 312.6
184
- 533.8 5182 -11.9 -25.0 33 0.95 305 39 312.5 315.8 312.7
185
- 500.0 5680 -15.9 -29.9 29 0.64 290 44 313.6 315.9 313.7
186
- 472.3 6096 -19.7 -33.4 28 0.49 285 46 314.1 315.8 314.1
187
- 453.0 6401 -22.4 -36.0 28 0.39 300 50 314.4 315.8 314.4
188
- 400.0 7310 -30.7 -43.7 27 0.20 285 44 315.0 315.8 315.0
189
- 399.7 7315 -30.8 -43.8 27 0.20 285 44 315.0 315.8 315.0
190
- 387.0 7543 -33.1 -46.1 26 0.16 281 47 314.9 315.5 314.9
191
- 382.7 7620 -33.8 -46.8 26 0.15 280 48 315.0 315.6 315.0
192
- 342.0 8398 -40.5 -53.5 23 0.08 293 52 316.1 316.4 316.1
193
- 320.4 8839 -43.7 -56.7 22 0.06 300 54 317.6 317.8 317.6
194
- 318.0 8890 -44.1 -57.1 22 0.05 301 55 317.8 318.0 317.8
195
- 310.0 9060 -44.7 -58.7 19 0.04 304 61 319.2 319.4 319.2
196
- 306.1 9144 -43.9 -57.9 20 0.05 305 63 321.5 321.7 321.5
197
- 305.0 9169 -43.7 -57.7 20 0.05 303 63 322.1 322.4 322.1
198
- 300.0 9280 -43.5 -57.5 20 0.05 295 64 323.9 324.2 323.9
199
- 292.0 9462 -43.7 -58.7 17 0.05 293 67 326.2 326.4 326.2
200
- 276.0 9838 -47.1 -62.1 16 0.03 290 74 326.6 326.7 326.6
201
- 264.0 10132 -47.5 -62.5 16 0.03 288 79 330.1 330.3 330.1
202
- 251.0 10464 -49.7 -64.7 16 0.03 285 85 331 .7 331.8 331 .7
203
- 250.0 10490 -49.7 -64.7 16 0.03 285 85 332.1 332.2 332.1
204
- 247.0 10569 -48.7 -63.7 16 0.03 283 88 334 .7 334.8 334 .7
205
- 244.0 10649 -48.9 -63.9 16 0.03 280 91 335.6 335.7 335.6
206
- 243.3 10668 -48.9 -63.9 16 0.03 280 91 335.8 335.9 335.8
207
- 220.0 11327 -50.3 -65.3 15 0.03 280 85 343.5 343.6 343.5
208
- 212.0 11569 -50.5 -65.5 15 0.03 280 83 346.8 346.9 346.8
209
- 210.0 11631 -49.7 -64.7 16 0.03 280 83 349.0 349.1 349.0
210
- 200.0 11950 -49.9 -64.9 15 0.03 280 80 353.6 353.7 353.6
211
- 194.0 12149 -49.9 -64.9 15 0.03 279 78 356.7 356.8 356.7
212
- 183.0 12529 -51.3 -66.3 15 0.03 278 75 360.4 360.5 360.4
213
- 164.0 13233 -55.3 -68.3 18 0.02 277 69 365.2 365.3 365.2
214
- 152.0 13716 -56.5 -69.5 18 0.02 275 65 371.1 371.2 371.1
215
- 150.0 13800 -57.1 -70.1 18 0.02 275 64 371.5 371.6 371.5
216
- 136.0 14414 -60.5 -72.5 19 0.02 268 54 376.0 376.1 376.0
217
- 132.0 14600 -60.1 -72.1 19 0.02 265 51 380.0 380.1 380.0
218
- 131.4 14630 -60.2 -72.2 19 0.02 265 51 380.3 380.4 380.3
219
- 128.0 14792 -60.9 -72.9 19 0.02 266 50 381 .9 382.0 381 .9
220
- 125.0 14939 -60.1 -72.1 19 0.02 268 49 385.9 386.0 385.9
221
- 119.0 15240 -62.2 -73.8 20 0.01 270 48 387.4 387.5 387.4
222
- 112.0 15616 -64.9 -75.9 21 0.01 265 53 389.3 389.3 389.3
223
- 108.0 15838 -64.1 -75.1 21 0.01 265 58 394.8 394.9 394.8
224
- 107.8 15850 -64.1 -75.1 21 0.01 265 58 395.0 395.1 395.0
225
- 105.0 16010 -64.7 -75.7 21 0.01 272 50 396.9 396.9 396.9
226
- 103.0 16128 -62.9 -73.9 21 0.02 277 45 402.5 402.6 402.5
227
- 100.0 16310 -62.5 -73.5 21 0.02 285 36 406.7 406.8 406.7
158
+ 978.0 345 7.8 0.8
159
+ 971.0 404 7.2 0.2
160
+ 946.7 610 5.2 -1.8
161
+ 944.0 634 5.0 -2.0
162
+ 925.0 798 3.4 -2.6
163
+ 911.8 914 2.4 -2.7
164
+ 906 .0 966 2. 0 -2.7
165
+ 877.9 1219 0.4 -3.2
166
+ 850.0 1478 -1.3 -3.7
167
+ 841.0 1563 -1.9 -3.8
168
+ 823.0 1736 1.4 -0.7
169
+ 813.6 1829 4. 5 1.2
170
+ 809 .0 1875 6.0 2.2
171
+ 798.0 1988 7.4 -0.6
172
+ 791.0 2061 7.6 -1.4
173
+ 783.9 2134 7.0 -1.7
174
+ 755. 1 2438 4.8 -3.1
175
+ 727.3 2743 2.5 -4.4
176
+ 700.5 3048 0.2 -5.8
177
+ 700.0 3054 0.2 -5.8
178
+ 698.0 3077 0.0 -6.0
179
+ 687.0 3204 -0.1 -7.1
180
+ 648.9 3658 -3.2 -10.9
181
+ 631.0 3881 -4.7 -12.7
182
+ 600.7 4267 -6.4 -16.7
183
+ 592.0 4381 -6.9 -17.9
184
+ 577.6 4572 -8.1 -19.6
185
+ 555.3 4877 -10.0 -22.3
186
+ 536.0 5151 -11.7 -24.7
187
+ 533.8 5182 -11.9 -25.0
188
+ 500.0 5680 -15.9 -29.9
189
+ 472.3 6096 -19.7 -33.4
190
+ 453.0 6401 -22.4 -36.0
191
+ 400.0 7310 -30.7 -43.7
192
+ 399.7 7315 -30.8 -43.8
193
+ 387.0 7543 -33.1 -46.1
194
+ 382.7 7620 -33.8 -46.8
195
+ 342.0 8398 -40.5 -53.5
196
+ 320.4 8839 -43.7 -56.7
197
+ 318.0 8890 -44.1 -57.1
198
+ 310.0 9060 -44.7 -58.7
199
+ 306.1 9144 -43.9 -57.9
200
+ 305.0 9169 -43.7 -57.7
201
+ 300.0 9280 -43.5 -57.5
202
+ 292.0 9462 -43.7 -58.7
203
+ 276.0 9838 -47.1 -62.1
204
+ 264.0 10132 -47.5 -62.5
205
+ 251.0 10464 -49 .7 -64 .7
206
+ 250.0 10490 -49.7 -64.7
207
+ 247.0 10569 -48 .7 -63 .7
208
+ 244.0 10649 -48.9 -63.9
209
+ 243.3 10668 -48.9 -63.9
210
+ 220.0 11327 -50.3 -65.3
211
+ 212.0 11569 -50.5 -65.5
212
+ 210.0 11631 -49.7 -64.7
213
+ 200.0 11950 -49.9 -64.9
214
+ 194.0 12149 -49.9 -64.9
215
+ 183.0 12529 -51.3 -66.3
216
+ 164.0 13233 -55.3 -68.3
217
+ 152.0 13716 -56.5 -69.5
218
+ 150.0 13800 -57.1 -70.1
219
+ 136.0 14414 -60.5 -72.5
220
+ 132.0 14600 -60.1 -72.1
221
+ 131.4 14630 -60.2 -72.2
222
+ 128.0 14792 -60 .9 -72 .9
223
+ 125.0 14939 -60.1 -72.1
224
+ 119.0 15240 -62.2 -73.8
225
+ 112.0 15616 -64.9 -75.9
226
+ 108.0 15838 -64.1 -75.1
227
+ 107.8 15850 -64.1 -75.1
228
+ 105.0 16010 -64.7 -75.7
229
+ 103.0 16128 -62.9 -73.9
230
+ 100.0 16310 -62.5 -73.5
228
231
'''
229
232
230
233
# Parse the data
231
234
sound_data = StringIO (data_txt )
232
- p , h , T , Td = np .loadtxt (sound_data , usecols = range ( 0 , 4 ), unpack = True )
235
+ p , h , T , Td = np .loadtxt (sound_data , unpack = True )
233
236
234
237
# Create a new figure. The dimensions here give a good aspect ratio
235
238
fig = plt .figure (figsize = (6.5875 , 6.2125 ))
0 commit comments