@@ -517,7 +517,7 @@ def __init__(self, parent, data=None, readonly=False, bg_value=None, bg_gradient
517
517
self .model_hlabels = LabelsArrayModel (parent = self , readonly = readonly )
518
518
self .view_hlabels = LabelsView (parent = self , model = self .model_hlabels , position = (TOP , RIGHT ))
519
519
520
- self .model_vlabels = LabelsArrayModel (parent = self , readonly = readonly )
520
+ self .model_vlabels = LabelsArrayModel (parent = self , readonly = readonly , orientation = Qt . Vertical )
521
521
self .view_vlabels = LabelsView (parent = self , model = self .model_vlabels , position = (BOTTOM , LEFT ))
522
522
523
523
self .model_data = DataArrayModel (parent = self , readonly = readonly , minvalue = minvalue , maxvalue = maxvalue )
@@ -617,6 +617,13 @@ def __init__(self, parent, data=None, readonly=False, bg_value=None, bg_gradient
617
617
self .bgcolor_checkbox = bgcolor
618
618
btn_layout .addWidget (bgcolor )
619
619
620
+ label = QLabel ("Horizontal Dimensions" )
621
+ btn_layout .addWidget (label )
622
+ spin = QSpinBox (self )
623
+ spin .valueChanged .connect (self .nb_horizontal_dims_changed )
624
+ self .nb_horizontal_dims_spinbox = spin
625
+ btn_layout .addWidget (spin )
626
+
620
627
# Set widget layout
621
628
layout = QVBoxLayout ()
622
629
layout .addLayout (self .filters_layout )
@@ -707,8 +714,9 @@ def set_data(self, data=None, bg_gradient=None, bg_value=None):
707
714
axes = la_data .axes
708
715
display_names = axes .display_names
709
716
710
- # update data format and bgcolor
717
+ # update data format and bgcolor + dim spinbox
711
718
self ._update_digits_scientific (la_data )
719
+ self .nb_horizontal_dims_spinbox .setValue (1 )
712
720
713
721
# update filters
714
722
filters_layout = self .filters_layout
@@ -727,7 +735,7 @@ def set_data(self, data=None, bg_gradient=None, bg_value=None):
727
735
self .view_vlabels .set_default_size ()
728
736
self .view_data .set_default_size ()
729
737
730
- def _update_digits_scientific (self , data ):
738
+ def _update_digits_scientific_dims (self , data ):
731
739
"""
732
740
data : LArray
733
741
"""
@@ -757,6 +765,9 @@ def _update_digits_scientific(self, data):
757
765
self .bgcolor_checkbox .setChecked (self .model_data .bgcolor_enabled )
758
766
self .bgcolor_checkbox .setEnabled (self .model_data .bgcolor_enabled )
759
767
768
+ self .nb_horizontal_dims_spinbox .setMinimum (1 )
769
+ self .nb_horizontal_dims_spinbox .setMaximum (max (1 , self .data_adapter .ndim - 1 ))
770
+
760
771
def choose_scientific (self , data ):
761
772
# max_digits = self.get_max_digits()
762
773
# default width can fit 8 chars
@@ -889,7 +900,7 @@ def dirty(self):
889
900
def accept_changes (self ):
890
901
"""Accept changes"""
891
902
la_data = self .data_adapter .accept_changes ()
892
- self ._update_digits_scientific (la_data )
903
+ self ._update_digits_scientific_dims (la_data )
893
904
894
905
def reject_changes (self ):
895
906
"""Reject changes"""
@@ -914,10 +925,13 @@ def digits_changed(self, value):
914
925
self .digits = value
915
926
self .model_data .set_format (self .cell_format )
916
927
928
+ def nb_horizontal_dims_changed (self , value ):
929
+ self .data_adapter .update_nb_dims_hlabels (value )
930
+
917
931
def create_filter_combo (self , axis ):
918
932
def filter_changed (checked_items ):
919
933
filtered = self .data_adapter .change_filter (axis , checked_items )
920
- self ._update_digits_scientific (filtered )
934
+ self ._update_digits_scientific_dims (filtered )
921
935
combo = FilterComboBox (self )
922
936
combo .addItems ([str (l ) for l in axis .labels ])
923
937
combo .checkedItemsChanged .connect (filter_changed )
@@ -949,15 +963,15 @@ def _selection_data(self, headers=True, none_selects_all=True):
949
963
if not self .data_adapter .ndim :
950
964
return raw_data
951
965
# FIXME: this is extremely ad-hoc.
952
- # TODO: in the future (pandas-based branch ) we should use to_string(data[self._selection_filter()])
966
+ # TODO: in the future (multi_index supported ) we should use to_string(data[self._selection_filter()])
953
967
dim_headers = self .model_axes .get_values ()
954
- hlabels = self .model_hlabels .get_values (top = col_min , bottom = col_max )
955
- topheaders = [[ dim_header [ 0 ] for dim_header in dim_headers ] + [ label [ 0 ] for label in hlabels ] ]
968
+ hlabels = self .model_hlabels .get_values (left = col_min , right = col_max )
969
+ topheaders = [dims + labels for dims , labels in zip ( dim_headers , hlabels ) ]
956
970
if self .data_adapter .ndim == 1 :
957
971
return chain (topheaders , [chain (['' ], row ) for row in raw_data ])
958
972
else :
959
973
assert self .data_adapter .ndim > 1
960
- vlabels = self .model_vlabels .get_values (left = row_min , right = row_max )
974
+ vlabels = self .model_vlabels .get_values (top = row_min , bottom = row_max )
961
975
return chain (topheaders ,
962
976
[chain ([vlabels [j ][r ] for j in range (len (vlabels ))], row )
963
977
for r , row in enumerate (raw_data )])
@@ -1041,12 +1055,13 @@ def plot(self):
1041
1055
row_min , row_max , col_min , col_max = self .view_data ._selection_bounds ()
1042
1056
dim_names = self .data_adapter .get_axes_names ()
1043
1057
# labels
1044
- xlabels = [label [0 ] for label in self .model_hlabels .get_values (top = col_min , bottom = col_max )]
1045
- ylabels = self .model_vlabels .get_values (left = row_min , right = row_max )
1046
- # transpose ylabels
1047
- ylabels = [[str (ylabels [i ][j ]) for i in range (len (ylabels ))] for j in range (len (ylabels [0 ]))]
1048
- # if there is only one dimension, ylabels is empty
1049
- if not ylabels :
1058
+ xlabels = self .model_hlabels .get_values (left = col_min , right = col_max , bottom = self .data_adapter .nb_dims_hlabels )
1059
+ xlabels = [[str (xlabels [i ][j ]) for i in range (len (xlabels ))] for j in range (len (xlabels [0 ]))]
1060
+ if self .data_adapter .ndim > 1 :
1061
+ ylabels = self .model_vlabels .get_values (top = row_min , bottom = row_max )
1062
+ # transpose ylabels
1063
+ ylabels = [[str (ylabels [i ][j ]) for i in range (len (ylabels ))] for j in range (len (ylabels [0 ]))]
1064
+ else :
1050
1065
ylabels = [[]]
1051
1066
1052
1067
assert data .ndim == 2
@@ -1066,7 +1081,7 @@ def plot(self):
1066
1081
else :
1067
1082
# plot each row as a line
1068
1083
xlabel = dim_names [- 1 ]
1069
- xticklabels = [str ( label ) for label in xlabels ]
1084
+ xticklabels = [' \n ' . join ( row ) for row in xlabels ]
1070
1085
xdata = np .arange (col_max - col_min )
1071
1086
for row in range (len (data )):
1072
1087
ax .plot (xdata , data [row ], label = ' ' .join (ylabels [row ]))
0 commit comments