8
8
RC_PARAMS = {"figure.figsize" : [5 , 5 ], "figure.dpi" : 220 , "pgf.rcfonts" : False }
9
9
10
10
11
- def test_clean_figure ():
12
- x = np .linspace (1 , 100 , 20 )
13
- y = np .linspace (1 , 100 , 20 )
14
-
15
- with plt .rc_context (rc = RC_PARAMS ):
16
- fig , ax = plt .subplots (1 , 1 , figsize = (5 , 5 ))
17
- (l ,) = ax .plot (x , y )
18
- ax .set_ylim ([20 , 80 ])
19
- ax .set_xlim ([20 , 80 ])
20
- cleanfigure .clean_figure (fig )
21
- plt .close ("all" )
11
+ class Test_pruneOutsideBox :
12
+ def test_pruneOutsideBox2D (self ):
13
+ """test against matlab2tikz implementation
22
14
15
+ octave code to generate baseline results.
16
+ Note that octave has indexing 1...N, whereas python has indexing 0...N-1.
17
+ ```octave
18
+ x = linspace(1, 100, 20);
19
+ y1 = linspace(1, 100, 20);
23
20
24
- def test_pruneOutsideBox ():
25
- """test against matlab2tikz implementation
21
+ figure
22
+ plot(x, y1)
23
+ xlim([20, 80])
24
+ ylim([20, 80])
25
+ cleanfigure;
26
+ ```
27
+ """
28
+ x = np .linspace (1 , 100 , 20 )
29
+ y = np .linspace (1 , 100 , 20 )
26
30
27
- octave code to generate baseline results.
28
- Note that octave has indexing 1...N, whereas python has indexing 0...N-1.
29
- ```octave
30
- x = linspace(1, 100, 20);
31
- y1 = linspace(1, 100, 20);
31
+ with plt .rc_context (rc = RC_PARAMS ):
32
+ fig , ax = plt .subplots (1 , 1 , figsize = (5 , 5 ))
33
+ (l ,) = ax .plot (x , y )
34
+ ax .set_ylim ([20 , 80 ])
35
+ ax .set_xlim ([20 , 80 ])
36
+ axhandle = ax
37
+ linehandle = l
38
+ fighandle = fig
39
+ data , is3D = cleanfigure ._get_line_data (linehandle )
40
+ xLim , yLim = cleanfigure ._get_visual_limits (fighandle , axhandle )
41
+ visual_data = cleanfigure ._get_visual_data (axhandle , data , is3D )
42
+ hasLines = cleanfigure ._line_has_lines (linehandle )
43
+
44
+ data = cleanfigure ._prune_outside_box (
45
+ xLim , yLim , data , visual_data , is3D , hasLines
46
+ )
47
+ assert data .shape == (14 , 2 )
32
48
33
- figure
34
- plot(x, y1)
35
- xlim([20, 80])
36
- ylim([20, 80])
37
- cleanfigure;
38
- ```
39
- """
40
- x = np .linspace (1 , 100 , 20 )
41
- y = np .linspace (1 , 100 , 20 )
49
+ def test_pruneOutsideBox3D (self ):
50
+ theta = np .linspace (- 4 * np .pi , 4 * np .pi , 100 )
51
+ z = np .linspace (- 2 , 2 , 100 )
52
+ r = z ** 2 + 1
53
+ x = r * np .sin (theta )
54
+ y = r * np .cos (theta )
42
55
43
- with plt .rc_context (rc = RC_PARAMS ):
44
- fig , ax = plt .subplots (1 , 1 , figsize = (5 , 5 ))
45
- (l ,) = ax .plot (x , y )
46
- ax .set_ylim ([20 , 80 ])
47
- ax .set_xlim ([20 , 80 ])
48
- axhandle = ax
49
- linehandle = l
50
- fighandle = fig
51
- xData , yData = cleanfigure ._get_visual_data (axhandle , linehandle )
52
- visual_data = cleanfigure ._stack_data_2D (xData , yData )
53
- data = cleanfigure ._get_data (linehandle )
54
- xLim , yLim = cleanfigure ._get_visual_limits (fighandle , axhandle )
55
- is3D = cleanfigure ._lineIs3D (linehandle )
56
- hasLines = cleanfigure ._line_has_lines (linehandle )
56
+ with plt .rc_context (rc = RC_PARAMS ):
57
+ fig = plt .figure ()
58
+ ax = fig .add_subplot (111 , projection = "3d" )
59
+ (l ,) = ax .plot (x , y , z )
60
+ ax .set_xlim ([- 2 , 2 ])
61
+ ax .set_ylim ([- 2 , 2 ])
62
+ ax .set_zlim ([- 2 , 2 ])
63
+ ax .view_init (30 , 30 )
57
64
58
- data = cleanfigure ._prune_outside_box (
59
- xLim , yLim , data , visual_data , is3D , hasLines
60
- )
61
- assert data .shape == (14 , 2 )
65
+ axhandle = ax
66
+ linehandle = l
67
+ fighandle = fig
68
+ data , is3D = cleanfigure ._get_line_data (linehandle )
69
+ xLim , yLim = cleanfigure ._get_visual_limits (fighandle , axhandle )
70
+ visual_data = cleanfigure ._get_visual_data (axhandle , data , is3D )
71
+ hasLines = cleanfigure ._line_has_lines (linehandle )
62
72
73
+ data = cleanfigure ._prune_outside_box (
74
+ xLim , yLim , data , visual_data , is3D , hasLines
75
+ )
76
+ assert data .shape == (86 , 3 )
77
+ plt .close ("all" )
63
78
64
79
65
80
def test_replaceDataWithNaN ():
@@ -84,8 +99,8 @@ def test_replaceDataWithNaN():
84
99
data = np .stack ([xData , yData ], axis = 1 )
85
100
86
101
newdata = cleanfigure ._replace_data_with_NaN (data , id_replace , False )
87
- assert newdata .shape == data .shape
88
- assert np .any (np .isnan (newdata ))
102
+ assert newdata .shape == data .shape
103
+ assert np .any (np .isnan (newdata ))
89
104
90
105
91
106
def test_removeData ():
@@ -132,17 +147,13 @@ def test_removeNaNs():
132
147
id_remove = np .array ([1 , 2 , 3 , 17 , 18 , 19 ])
133
148
xData = np .linspace (1 , 100 , 20 )
134
149
yData = xData .copy ()
150
+ data = cleanfigure ._stack_data_2D (xData , yData )
135
151
136
- with plt .rc_context (rc = RC_PARAMS ):
137
- fig , ax = plt .subplots (1 , 1 , figsize = (5 , 5 ))
138
- (l ,) = ax .plot (xData , yData )
139
- cleanfigure ._replace_data_with_NaN (l , id_replace )
140
- cleanfigure ._remove_data (l , id_remove )
141
- cleanfigure ._remove_NaNs (l )
142
- newdata = np .stack (l .get_data (), axis = 1 )
143
- assert not np .any (np .isnan (newdata ))
144
- assert newdata .shape == (12 , 2 )
145
- plt .close ("all" )
152
+ data = cleanfigure ._replace_data_with_NaN (data , id_replace , False )
153
+ data = cleanfigure ._remove_data (data , id_remove , False )
154
+ data = cleanfigure ._remove_NaNs (data )
155
+ assert not np .any (np .isnan (data ))
156
+ assert data .shape == (12 , 2 )
146
157
147
158
148
159
def test_isInBox ():
@@ -200,104 +211,6 @@ def test_getVisualLimits():
200
211
plt .close ("all" )
201
212
202
213
203
- def test_movePointsCloser ():
204
- """octave code
205
- ```octave
206
- addpath ("../matlab2tikz/src")
207
-
208
- x = linspace(1, 100, 20);
209
- y1 = linspace(1, 100, 20);
210
-
211
- figure
212
- plot(x, y1)
213
- xlim([20, 80])
214
- ylim([20, 80])
215
- set(gcf,'Units','Inches');
216
- set(gcf,'Position',[2.5 2.5 5 5])
217
- cleanfigure;
218
- ```
219
- """
220
- x = np .linspace (1 , 100 , 20 )
221
- y = np .linspace (1 , 100 , 20 )
222
-
223
- with plt .rc_context (rc = RC_PARAMS ):
224
- fig , ax = plt .subplots (1 , 1 , figsize = (5 , 5 ))
225
- (l ,) = ax .plot (x , y )
226
- ax .set_ylim ([20 , 80 ])
227
- ax .set_xlim ([20 , 80 ])
228
- cleanfigure ._prune_outside_box (fig , ax , l )
229
- cleanfigure ._move_points_closer (fig , ax , l )
230
- assert l .get_xdata ().shape == (14 ,)
231
- plt .close ("all" )
232
-
233
-
234
- def test_simplifyLine ():
235
- """octave code
236
- ```octave
237
- addpath ("../matlab2tikz/src")
238
-
239
- x = linspace(1, 100, 20);
240
- y1 = linspace(1, 100, 20);
241
-
242
- figure
243
- plot(x, y1)
244
- xlim([20, 80])
245
- ylim([20, 80])
246
- set(gcf,'Units','Inches');
247
- set(gcf,'Position',[2.5 2.5 5 5])
248
- cleanfigure;
249
- ```
250
- """
251
- x = np .linspace (1 , 100 , 20 )
252
- y = np .linspace (1 , 100 , 20 )
253
-
254
- with plt .rc_context (rc = RC_PARAMS ):
255
- fig , ax = plt .subplots (1 , 1 , figsize = (5 , 5 ))
256
- (l ,) = ax .plot (x , y )
257
- ax .set_ylim ([20 , 80 ])
258
- ax .set_xlim ([20 , 80 ])
259
- cleanfigure ._prune_outside_box (fig , ax , l )
260
- cleanfigure ._move_points_closer (fig , ax , l )
261
- cleanfigure ._simplify_line (fig , ax , l , 600 )
262
- assert l .get_xdata ().shape == (2 ,)
263
- assert l .get_ydata ().shape == (2 ,)
264
- plt .close ("all" )
265
-
266
-
267
- def test_limitPrecision ():
268
- """octave code
269
- ```octave
270
- addpath ("../matlab2tikz/src")
271
-
272
- x = linspace(1, 100, 20);
273
- y1 = linspace(1, 100, 20);
274
-
275
- figure
276
- plot(x, y1)
277
- xlim([20, 80])
278
- ylim([20, 80])
279
- set(gcf,'Units','Inches');
280
- set(gcf,'Position',[2.5 2.5 5 5])
281
- cleanfigure;
282
- ```
283
- """
284
- x = np .linspace (1 , 100 , 20 )
285
- y = np .linspace (1 , 100 , 20 )
286
-
287
- with plt .rc_context (rc = RC_PARAMS ):
288
- fig , ax = plt .subplots (1 , 1 , figsize = (5 , 5 ))
289
- (l ,) = ax .plot (x , y )
290
- ax .set_ylim ([20 , 80 ])
291
- ax .set_xlim ([20 , 80 ])
292
- cleanfigure ._prune_outside_box (fig , ax , l )
293
- cleanfigure ._move_points_closer (fig , ax , l )
294
- cleanfigure ._simplify_line (fig , ax , l , 600 )
295
- cleanfigure ._limit_precision (fig , ax , l , 1 )
296
- assert l .get_xdata ().shape == (2 ,)
297
- assert l .get_ydata ().shape == (2 ,)
298
- plt .close ("all" )
299
-
300
-
301
214
def test_opheimSimplify ():
302
215
"""test path simplification
303
216
@@ -467,22 +380,35 @@ def test_plot3d(self):
467
380
# Use number of lines to test if it worked.
468
381
numLinesRaw = raw .count ("\n " )
469
382
numLinesClean = clean .count ("\n " )
383
+
470
384
assert numLinesRaw - numLinesClean == 14
471
385
plt .close ("all" )
472
386
473
387
def test_scatter3d (self ):
474
- x , y = np .meshgrid (np .linspace (1 , 100 , 20 ), np .linspace (1 , 100 , 20 ))
475
- z = np .abs (x - 50 ) + np .abs (y - 50 )
388
+ theta = np .linspace (- 4 * np .pi , 4 * np .pi , 100 )
389
+ z = np .linspace (- 2 , 2 , 100 )
390
+ r = z ** 2 + 1
391
+ x = r * np .sin (theta )
392
+ y = r * np .cos (theta )
476
393
477
394
with plt .rc_context (rc = RC_PARAMS ):
478
395
fig = plt .figure ()
479
396
ax = fig .add_subplot (111 , projection = "3d" )
480
397
ax .scatter (x , y , z )
481
- ax .set_xlim ([20 , 80 ])
482
- ax .set_ylim ([20 , 80 ])
483
- ax .set_zlim ([0 , 80 ])
484
- with pytest .warns (Warning ):
485
- cleanfigure .clean_figure (fig )
398
+ ax .set_xlim ([- 2 , 2 ])
399
+ ax .set_ylim ([- 2 , 2 ])
400
+ ax .set_zlim ([- 2 , 2 ])
401
+ ax .view_init (30 , 30 )
402
+ raw = get_tikz_code (fig )
403
+
404
+ cleanfigure .clean_figure (fig )
405
+ clean = get_tikz_code ()
406
+
407
+ # Use number of lines to test if it worked.
408
+ numLinesRaw = raw .count ("\n " )
409
+ numLinesClean = clean .count ("\n " )
410
+
411
+ assert numLinesRaw - numLinesClean == 14
486
412
plt .close ("all" )
487
413
488
414
def test_wireframe3D (self ):
@@ -717,7 +643,7 @@ def test_2D_in_3D(self):
717
643
plt .close ("all" )
718
644
719
645
720
- class Test_lineplot :
646
+ class Test_lineplot_markers :
721
647
def test_line_no_markers (self ):
722
648
"""test high-level usage for simple example.
723
649
Test is successfull if generated tikz code saves correct amount of lines
0 commit comments