@@ -517,7 +517,7 @@ def __init__(self, parent, data, readonly=False, bg_value=None, bg_gradient=None
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, readonly=False, bg_value=None, bg_gradient=None
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 )
@@ -702,7 +709,8 @@ def dropEvent(self, event):
702
709
703
710
def set_data (self , data , bg_gradient = None , bg_value = None ):
704
711
self .data_adapter .set_data (data , bg_gradient = bg_gradient , bg_value = bg_value )
705
- self ._update_digits_scientific (self .data_adapter .get_data ())
712
+ self ._update_digits_scientific_dims (self .data_adapter .get_data ())
713
+ self .nb_horizontal_dims_spinbox .setValue (1 )
706
714
707
715
# update filters
708
716
la_data = self .data_adapter .get_data ()
@@ -721,11 +729,11 @@ def set_data(self, data, bg_gradient=None, bg_value=None):
721
729
722
730
# reset default size
723
731
self .view_axes .set_default_size ()
724
- self .view_ylabels .set_default_size ()
725
- self .view_xlabels .set_default_size ()
732
+ self .view_vlabels .set_default_size ()
733
+ self .view_hlabels .set_default_size ()
726
734
self .view_data .set_default_size ()
727
735
728
- def _update_digits_scientific (self , data ):
736
+ def _update_digits_scientific_dims (self , data ):
729
737
"""
730
738
data : LArray
731
739
"""
@@ -755,6 +763,9 @@ def _update_digits_scientific(self, data):
755
763
self .bgcolor_checkbox .setChecked (self .model_data .bgcolor_enabled )
756
764
self .bgcolor_checkbox .setEnabled (self .model_data .bgcolor_enabled )
757
765
766
+ self .nb_horizontal_dims_spinbox .setMinimum (1 )
767
+ self .nb_horizontal_dims_spinbox .setMaximum (max (1 , self .data_adapter .ndim - 1 ))
768
+
758
769
def choose_scientific (self , data ):
759
770
# max_digits = self.get_max_digits()
760
771
# default width can fit 8 chars
@@ -887,7 +898,7 @@ def dirty(self):
887
898
def accept_changes (self ):
888
899
"""Accept changes"""
889
900
la_data = self .data_adapter .accept_changes ()
890
- self ._update_digits_scientific (la_data )
901
+ self ._update_digits_scientific_dims (la_data )
891
902
892
903
def reject_changes (self ):
893
904
"""Reject changes"""
@@ -912,10 +923,13 @@ def digits_changed(self, value):
912
923
self .digits = value
913
924
self .model_data .set_format (self .cell_format )
914
925
926
+ def nb_horizontal_dims_changed (self , value ):
927
+ self .data_adapter .update_nb_dims_hlabels (value )
928
+
915
929
def create_filter_combo (self , axis ):
916
930
def filter_changed (checked_items ):
917
931
filtered = self .data_adapter .change_filter (axis , checked_items )
918
- self ._update_digits_scientific (filtered )
932
+ self ._update_digits_scientific_dims (filtered )
919
933
combo = FilterComboBox (self )
920
934
combo .addItems ([str (l ) for l in axis .labels ])
921
935
combo .checkedItemsChanged .connect (filter_changed )
@@ -947,15 +961,15 @@ def _selection_data(self, headers=True, none_selects_all=True):
947
961
if not self .data_adapter .ndim :
948
962
return raw_data
949
963
# FIXME: this is extremely ad-hoc.
950
- # TODO: in the future (pandas-based branch ) we should use to_string(data[self._selection_filter()])
964
+ # TODO: in the future (multi_index supported ) we should use to_string(data[self._selection_filter()])
951
965
dim_headers = self .model_axes .get_values ()
952
- hlabels = self .model_hlabels .get_values (top = col_min , bottom = col_max )
953
- topheaders = [[ dim_header [ 0 ] for dim_header in dim_headers ] + [ label [ 0 ] for label in hlabels ] ]
966
+ hlabels = self .model_hlabels .get_values (left = col_min , right = col_max )
967
+ topheaders = [dims + labels for dims , labels in zip ( dim_headers , hlabels ) ]
954
968
if self .data_adapter .ndim == 1 :
955
969
return chain (topheaders , [chain (['' ], row ) for row in raw_data ])
956
970
else :
957
971
assert self .data_adapter .ndim > 1
958
- vlabels = self .model_vlabels .get_values (left = row_min , right = row_max )
972
+ vlabels = self .model_vlabels .get_values (top = row_min , bottom = row_max )
959
973
return chain (topheaders ,
960
974
[chain ([vlabels [j ][r ] for j in range (len (vlabels ))], row )
961
975
for r , row in enumerate (raw_data )])
@@ -1039,12 +1053,13 @@ def plot(self):
1039
1053
row_min , row_max , col_min , col_max = self .view_data ._selection_bounds ()
1040
1054
dim_names = self .data_adapter .get_axes_names ()
1041
1055
# labels
1042
- xlabels = [label [0 ] for label in self .model_hlabels .get_values (top = col_min , bottom = col_max )]
1043
- ylabels = self .model_vlabels .get_values (left = row_min , right = row_max )
1044
- # transpose ylabels
1045
- ylabels = [[str (ylabels [i ][j ]) for i in range (len (ylabels ))] for j in range (len (ylabels [0 ]))]
1046
- # if there is only one dimension, ylabels is empty
1047
- if not ylabels :
1056
+ xlabels = self .model_hlabels .get_values (left = col_min , right = col_max , bottom = self .data_adapter .nb_dims_hlabels )
1057
+ xlabels = [[str (xlabels [i ][j ]) for i in range (len (xlabels ))] for j in range (len (xlabels [0 ]))]
1058
+ if self .data_adapter .ndim > 1 :
1059
+ ylabels = self .model_vlabels .get_values (top = row_min , bottom = row_max )
1060
+ # transpose ylabels
1061
+ ylabels = [[str (ylabels [i ][j ]) for i in range (len (ylabels ))] for j in range (len (ylabels [0 ]))]
1062
+ else :
1048
1063
ylabels = [[]]
1049
1064
1050
1065
assert data .ndim == 2
@@ -1064,7 +1079,7 @@ def plot(self):
1064
1079
else :
1065
1080
# plot each row as a line
1066
1081
xlabel = dim_names [- 1 ]
1067
- xticklabels = [str ( label ) for label in xlabels ]
1082
+ xticklabels = [' \n ' . join ( row ) for row in xlabels ]
1068
1083
xdata = np .arange (col_max - col_min )
1069
1084
for row in range (len (data )):
1070
1085
ax .plot (xdata , data [row ], label = ' ' .join (ylabels [row ]))
0 commit comments