@@ -670,7 +670,7 @@ def test_hist_layout_with_by(self):
670
670
axes = _check_plot_works (df .height .hist , by = df .classroom , layout = (2 , 2 ))
671
671
self ._check_axes_shape (axes , axes_num = 3 , layout = (2 , 2 ))
672
672
673
- axes = _check_plot_works ( df .height .hist , by = df .category , layout = (4 , 2 ), figsize = (12 , 7 ))
673
+ axes = df .height .hist ( by = df .category , layout = (4 , 2 ), figsize = (12 , 7 ))
674
674
self ._check_axes_shape (axes , axes_num = 4 , layout = (4 , 2 ), figsize = (12 , 7 ))
675
675
676
676
@slow
@@ -1071,6 +1071,7 @@ def test_subplots(self):
1071
1071
for kind in ['bar' , 'barh' , 'line' , 'area' ]:
1072
1072
axes = df .plot (kind = kind , subplots = True , sharex = True , legend = True )
1073
1073
self ._check_axes_shape (axes , axes_num = 3 , layout = (3 , 1 ))
1074
+ self .assertEqual (axes .shape , (3 , ))
1074
1075
1075
1076
for ax , column in zip (axes , df .columns ):
1076
1077
self ._check_legend_labels (ax , labels = [com .pprint_thing (column )])
@@ -1133,6 +1134,77 @@ def test_subplots_timeseries(self):
1133
1134
self ._check_visible (ax .get_yticklabels ())
1134
1135
self ._check_ticks_props (ax , xlabelsize = 7 , xrot = 45 )
1135
1136
1137
+ def test_subplots_layout (self ):
1138
+ # GH 6667
1139
+ df = DataFrame (np .random .rand (10 , 3 ),
1140
+ index = list (string .ascii_letters [:10 ]))
1141
+
1142
+ axes = df .plot (subplots = True , layout = (2 , 2 ))
1143
+ self ._check_axes_shape (axes , axes_num = 3 , layout = (2 , 2 ))
1144
+ self .assertEqual (axes .shape , (2 , 2 ))
1145
+
1146
+ axes = df .plot (subplots = True , layout = (1 , 4 ))
1147
+ self ._check_axes_shape (axes , axes_num = 3 , layout = (1 , 4 ))
1148
+ self .assertEqual (axes .shape , (1 , 4 ))
1149
+
1150
+ with tm .assertRaises (ValueError ):
1151
+ axes = df .plot (subplots = True , layout = (1 , 1 ))
1152
+
1153
+ # single column
1154
+ df = DataFrame (np .random .rand (10 , 1 ),
1155
+ index = list (string .ascii_letters [:10 ]))
1156
+ axes = df .plot (subplots = True )
1157
+ self ._check_axes_shape (axes , axes_num = 1 , layout = (1 , 1 ))
1158
+ self .assertEqual (axes .shape , (1 , ))
1159
+
1160
+ axes = df .plot (subplots = True , layout = (3 , 3 ))
1161
+ self ._check_axes_shape (axes , axes_num = 1 , layout = (3 , 3 ))
1162
+ self .assertEqual (axes .shape , (3 , 3 ))
1163
+
1164
+ @slow
1165
+ def test_subplots_multiple_axes (self ):
1166
+ # GH 5353, 6970, GH 7069
1167
+ fig , axes = self .plt .subplots (2 , 3 )
1168
+ df = DataFrame (np .random .rand (10 , 3 ),
1169
+ index = list (string .ascii_letters [:10 ]))
1170
+
1171
+ returned = df .plot (subplots = True , ax = axes [0 ])
1172
+ self ._check_axes_shape (returned , axes_num = 3 , layout = (1 , 3 ))
1173
+ self .assertEqual (returned .shape , (3 , ))
1174
+ self .assertIs (returned [0 ].figure , fig )
1175
+ # draw on second row
1176
+ returned = df .plot (subplots = True , ax = axes [1 ])
1177
+ self ._check_axes_shape (returned , axes_num = 3 , layout = (1 , 3 ))
1178
+ self .assertEqual (returned .shape , (3 , ))
1179
+ self .assertIs (returned [0 ].figure , fig )
1180
+ self ._check_axes_shape (axes , axes_num = 6 , layout = (2 , 3 ))
1181
+ tm .close ()
1182
+
1183
+ with tm .assertRaises (ValueError ):
1184
+ fig , axes = self .plt .subplots (2 , 3 )
1185
+ # pass different number of axes from required
1186
+ df .plot (subplots = True , ax = axes )
1187
+
1188
+ # pass 2-dim axes and invalid layout
1189
+ # invalid lauout should not affect to input and return value
1190
+ # (show warning is tested in
1191
+ # TestDataFrameGroupByPlots.test_grouped_box_multiple_axes
1192
+ fig , axes = self .plt .subplots (2 , 2 )
1193
+ df = DataFrame (np .random .rand (10 , 4 ),
1194
+ index = list (string .ascii_letters [:10 ]))
1195
+
1196
+ returned = df .plot (subplots = True , ax = axes , layout = (2 , 1 ))
1197
+ self ._check_axes_shape (returned , axes_num = 4 , layout = (2 , 2 ))
1198
+ self .assertEqual (returned .shape , (4 , ))
1199
+
1200
+ # single column
1201
+ fig , axes = self .plt .subplots (1 , 1 )
1202
+ df = DataFrame (np .random .rand (10 , 1 ),
1203
+ index = list (string .ascii_letters [:10 ]))
1204
+ axes = df .plot (subplots = True , ax = [axes ])
1205
+ self ._check_axes_shape (axes , axes_num = 1 , layout = (1 , 1 ))
1206
+ self .assertEqual (axes .shape , (1 , ))
1207
+
1136
1208
def test_negative_log (self ):
1137
1209
df = - DataFrame (rand (6 , 4 ),
1138
1210
index = list (string .ascii_letters [:6 ]),
@@ -1718,15 +1790,15 @@ def test_hist_df_coord(self):
1718
1790
normal_df = DataFrame ({'A' : np .repeat (np .array ([1 , 2 , 3 , 4 , 5 ]),
1719
1791
np .array ([10 , 9 , 8 , 7 , 6 ])),
1720
1792
'B' : np .repeat (np .array ([1 , 2 , 3 , 4 , 5 ]),
1721
- np .array ([8 , 8 , 8 , 8 , 8 ])),
1793
+ np .array ([8 , 8 , 8 , 8 , 8 ])),
1722
1794
'C' : np .repeat (np .array ([1 , 2 , 3 , 4 , 5 ]),
1723
1795
np .array ([6 , 7 , 8 , 9 , 10 ]))},
1724
1796
columns = ['A' , 'B' , 'C' ])
1725
1797
1726
1798
nan_df = DataFrame ({'A' : np .repeat (np .array ([np .nan , 1 , 2 , 3 , 4 , 5 ]),
1727
1799
np .array ([3 , 10 , 9 , 8 , 7 , 6 ])),
1728
1800
'B' : np .repeat (np .array ([1 , np .nan , 2 , 3 , 4 , 5 ]),
1729
- np .array ([8 , 3 , 8 , 8 , 8 , 8 ])),
1801
+ np .array ([8 , 3 , 8 , 8 , 8 , 8 ])),
1730
1802
'C' : np .repeat (np .array ([1 , 2 , 3 , np .nan , 4 , 5 ]),
1731
1803
np .array ([6 , 7 , 8 , 3 , 9 , 10 ]))},
1732
1804
columns = ['A' , 'B' , 'C' ])
@@ -2712,6 +2784,41 @@ def test_grouped_box_layout(self):
2712
2784
return_type = 'dict' )
2713
2785
self ._check_axes_shape (self .plt .gcf ().axes , axes_num = 3 , layout = (1 , 4 ))
2714
2786
2787
+ @slow
2788
+ def test_grouped_box_multiple_axes (self ):
2789
+ # GH 6970, GH 7069
2790
+ df = self .hist_df
2791
+
2792
+ # check warning to ignore sharex / sharey
2793
+ # this check should be done in the first function which
2794
+ # passes multiple axes to plot, hist or boxplot
2795
+ # location should be changed if other test is added
2796
+ # which has earlier alphabetical order
2797
+ with tm .assert_produces_warning (UserWarning ):
2798
+ fig , axes = self .plt .subplots (2 , 2 )
2799
+ df .groupby ('category' ).boxplot (column = 'height' , return_type = 'axes' , ax = axes )
2800
+ self ._check_axes_shape (self .plt .gcf ().axes , axes_num = 4 , layout = (2 , 2 ))
2801
+
2802
+ fig , axes = self .plt .subplots (2 , 3 )
2803
+ returned = df .boxplot (column = ['height' , 'weight' , 'category' ], by = 'gender' ,
2804
+ return_type = 'axes' , ax = axes [0 ])
2805
+ returned = np .array (returned .values ())
2806
+ self ._check_axes_shape (returned , axes_num = 3 , layout = (1 , 3 ))
2807
+ self .assert_numpy_array_equal (returned , axes [0 ])
2808
+ self .assertIs (returned [0 ].figure , fig )
2809
+ # draw on second row
2810
+ returned = df .groupby ('classroom' ).boxplot (column = ['height' , 'weight' , 'category' ],
2811
+ return_type = 'axes' , ax = axes [1 ])
2812
+ returned = np .array (returned .values ())
2813
+ self ._check_axes_shape (returned , axes_num = 3 , layout = (1 , 3 ))
2814
+ self .assert_numpy_array_equal (returned , axes [1 ])
2815
+ self .assertIs (returned [0 ].figure , fig )
2816
+
2817
+ with tm .assertRaises (ValueError ):
2818
+ fig , axes = self .plt .subplots (2 , 3 )
2819
+ # pass different number of axes from required
2820
+ axes = df .groupby ('classroom' ).boxplot (ax = axes )
2821
+
2715
2822
@slow
2716
2823
def test_grouped_hist_layout (self ):
2717
2824
@@ -2724,12 +2831,12 @@ def test_grouped_hist_layout(self):
2724
2831
axes = _check_plot_works (df .hist , column = 'height' , by = df .gender , layout = (2 , 1 ))
2725
2832
self ._check_axes_shape (axes , axes_num = 2 , layout = (2 , 1 ))
2726
2833
2727
- axes = _check_plot_works ( df .hist , column = 'height' , by = df .category , layout = (4 , 1 ))
2834
+ axes = df .hist ( column = 'height' , by = df .category , layout = (4 , 1 ))
2728
2835
self ._check_axes_shape (axes , axes_num = 4 , layout = (4 , 1 ))
2729
2836
2730
- axes = _check_plot_works (df .hist , column = 'height' , by = df .category ,
2731
- layout = (4 , 2 ), figsize = (12 , 8 ))
2837
+ axes = df .hist (column = 'height' , by = df .category , layout = (4 , 2 ), figsize = (12 , 8 ))
2732
2838
self ._check_axes_shape (axes , axes_num = 4 , layout = (4 , 2 ), figsize = (12 , 8 ))
2839
+ tm .close ()
2733
2840
2734
2841
# GH 6769
2735
2842
axes = _check_plot_works (df .hist , column = 'height' , by = 'classroom' , layout = (2 , 2 ))
@@ -2739,13 +2846,32 @@ def test_grouped_hist_layout(self):
2739
2846
axes = _check_plot_works (df .hist , by = 'classroom' )
2740
2847
self ._check_axes_shape (axes , axes_num = 3 , layout = (2 , 2 ))
2741
2848
2742
- axes = _check_plot_works ( df .hist , by = 'gender' , layout = (3 , 5 ))
2849
+ axes = df .hist ( by = 'gender' , layout = (3 , 5 ))
2743
2850
self ._check_axes_shape (axes , axes_num = 2 , layout = (3 , 5 ))
2744
2851
2745
- axes = _check_plot_works ( df .hist , column = ['height' , 'weight' , 'category' ])
2852
+ axes = df .hist ( column = ['height' , 'weight' , 'category' ])
2746
2853
self ._check_axes_shape (axes , axes_num = 3 , layout = (2 , 2 ))
2747
2854
2748
2855
@slow
2856
+ def test_grouped_hist_multiple_axes (self ):
2857
+ # GH 6970, GH 7069
2858
+ df = self .hist_df
2859
+
2860
+ fig , axes = self .plt .subplots (2 , 3 )
2861
+ returned = df .hist (column = ['height' , 'weight' , 'category' ], ax = axes [0 ])
2862
+ self ._check_axes_shape (returned , axes_num = 3 , layout = (1 , 3 ))
2863
+ self .assert_numpy_array_equal (returned , axes [0 ])
2864
+ self .assertIs (returned [0 ].figure , fig )
2865
+ returned = df .hist (by = 'classroom' , ax = axes [1 ])
2866
+ self ._check_axes_shape (returned , axes_num = 3 , layout = (1 , 3 ))
2867
+ self .assert_numpy_array_equal (returned , axes [1 ])
2868
+ self .assertIs (returned [0 ].figure , fig )
2869
+
2870
+ with tm .assertRaises (ValueError ):
2871
+ fig , axes = self .plt .subplots (2 , 3 )
2872
+ # pass different number of axes from required
2873
+ axes = df .hist (column = 'height' , ax = axes )
2874
+ @slow
2749
2875
def test_axis_share_x (self ):
2750
2876
df = self .hist_df
2751
2877
# GH4089
0 commit comments