@@ -539,7 +539,7 @@ def __init__(self, parent, data=None, readonly=False, bg_value=None, bg_gradient
539539 self .model_hlabels = LabelsArrayModel (parent = self , readonly = readonly )
540540 self .view_hlabels = LabelsView (parent = self , model = self .model_hlabels , position = (TOP , RIGHT ))
541541
542- self .model_vlabels = LabelsArrayModel (parent = self , readonly = readonly )
542+ self .model_vlabels = LabelsArrayModel (parent = self , readonly = readonly , orientation = Qt . Vertical )
543543 self .view_vlabels = LabelsView (parent = self , model = self .model_vlabels , position = (BOTTOM , LEFT ))
544544
545545 self .model_data = DataArrayModel (parent = self , readonly = readonly , minvalue = minvalue , maxvalue = maxvalue )
@@ -662,6 +662,13 @@ def __init__(self, parent, data=None, readonly=False, bg_value=None, bg_gradient
662662 btn_layout .addWidget (gradient_chooser )
663663 self .gradient_chooser = gradient_chooser
664664
665+ label = QLabel ("Horizontal Dimensions" )
666+ btn_layout .addWidget (label )
667+ spin = QSpinBox (self )
668+ spin .valueChanged .connect (self .nb_horizontal_dims_changed )
669+ self .nb_horizontal_dims_spinbox = spin
670+ btn_layout .addWidget (spin )
671+
665672 # Set widget layout
666673 layout = QVBoxLayout ()
667674 layout .addLayout (self .filters_layout )
@@ -760,8 +767,9 @@ def set_data(self, data=None, bg_value=None):
760767 axes = la_data .axes
761768 display_names = axes .display_names
762769
763- # update data format and bgcolor
764- self ._update_digits_scientific (la_data )
770+ # update data format and bgcolor + dim spinbox
771+ self ._update_digits_scientific_dims (la_data )
772+ self .nb_horizontal_dims_spinbox .setValue (1 )
765773
766774 # update filters
767775 filters_layout = self .filters_layout
@@ -781,7 +789,7 @@ def set_data(self, data=None, bg_value=None):
781789 self .view_vlabels .set_default_size ()
782790 self .view_data .set_default_size ()
783791
784- def _update_digits_scientific (self , data ):
792+ def _update_digits_scientific_dims (self , data ):
785793 """
786794 data : LArray
787795 """
@@ -810,6 +818,9 @@ def _update_digits_scientific(self, data):
810818
811819 self .gradient_chooser .setEnabled (self .model_data .bgcolor_possible )
812820
821+ self .nb_horizontal_dims_spinbox .setMinimum (1 )
822+ self .nb_horizontal_dims_spinbox .setMaximum (max (1 , self .data_adapter .ndim - 1 ))
823+
813824 def choose_scientific (self , data ):
814825 # max_digits = self.get_max_digits()
815826 # default width can fit 8 chars
@@ -942,7 +953,7 @@ def dirty(self):
942953 def accept_changes (self ):
943954 """Accept changes"""
944955 la_data = self .data_adapter .accept_changes ()
945- self ._update_digits_scientific (la_data )
956+ self ._update_digits_scientific_dims (la_data )
946957
947958 def reject_changes (self ):
948959 """Reject changes"""
@@ -967,6 +978,9 @@ def digits_changed(self, value):
967978 self .digits = value
968979 self .model_data .set_format (self .cell_format )
969980
981+ def nb_horizontal_dims_changed (self , value ):
982+ self .data_adapter .update_nb_dims_hlabels (value )
983+
970984 def create_filter_combo (self , axis ):
971985 def filter_changed (checked_items ):
972986 self .data_adapter .change_filter (axis , checked_items )
@@ -1001,15 +1015,15 @@ def _selection_data(self, headers=True, none_selects_all=True):
10011015 if not self .data_adapter .ndim :
10021016 return raw_data
10031017 # FIXME: this is extremely ad-hoc.
1004- # TODO: in the future (pandas-based branch ) we should use to_string(data[self._selection_filter()])
1018+ # TODO: in the future (multi_index supported ) we should use to_string(data[self._selection_filter()])
10051019 dim_headers = self .model_axes .get_values ()
1006- hlabels = self .model_hlabels .get_values (top = col_min , bottom = col_max )
1007- topheaders = [[ dim_header [ 0 ] for dim_header in dim_headers ] + [ label [ 0 ] for label in hlabels ] ]
1020+ hlabels = self .model_hlabels .get_values (left = col_min , right = col_max )
1021+ topheaders = [dims + labels for dims , labels in zip ( dim_headers , hlabels ) ]
10081022 if self .data_adapter .ndim == 1 :
10091023 return chain (topheaders , [chain (['' ], row ) for row in raw_data ])
10101024 else :
10111025 assert self .data_adapter .ndim > 1
1012- vlabels = self .model_vlabels .get_values (left = row_min , right = row_max )
1026+ vlabels = self .model_vlabels .get_values (top = row_min , bottom = row_max )
10131027 return chain (topheaders ,
10141028 [chain ([vlabels [j ][r ] for j in range (len (vlabels ))], row )
10151029 for r , row in enumerate (raw_data )])
@@ -1093,12 +1107,13 @@ def plot(self):
10931107 row_min , row_max , col_min , col_max = self .view_data ._selection_bounds ()
10941108 dim_names = self .data_adapter .get_axes_names ()
10951109 # labels
1096- xlabels = [label [0 ] for label in self .model_hlabels .get_values (top = col_min , bottom = col_max )]
1097- ylabels = self .model_vlabels .get_values (left = row_min , right = row_max )
1098- # transpose ylabels
1099- ylabels = [[str (ylabels [i ][j ]) for i in range (len (ylabels ))] for j in range (len (ylabels [0 ]))]
1100- # if there is only one dimension, ylabels is empty
1101- if not ylabels :
1110+ xlabels = self .model_hlabels .get_values (left = col_min , right = col_max , bottom = self .data_adapter .nb_dims_hlabels )
1111+ xlabels = [[str (xlabels [i ][j ]) for i in range (len (xlabels ))] for j in range (len (xlabels [0 ]))]
1112+ if self .data_adapter .ndim > 1 :
1113+ ylabels = self .model_vlabels .get_values (top = row_min , bottom = row_max )
1114+ # transpose ylabels
1115+ ylabels = [[str (ylabels [i ][j ]) for i in range (len (ylabels ))] for j in range (len (ylabels [0 ]))]
1116+ else :
11021117 ylabels = [[]]
11031118
11041119 assert data .ndim == 2
@@ -1118,7 +1133,7 @@ def plot(self):
11181133 else :
11191134 # plot each row as a line
11201135 xlabel = dim_names [- 1 ]
1121- xticklabels = [str ( label ) for label in xlabels ]
1136+ xticklabels = [' \n ' . join ( row ) for row in xlabels ]
11221137 xdata = np .arange (col_max - col_min )
11231138 for row in range (len (data )):
11241139 ax .plot (xdata , data [row ], label = ' ' .join (ylabels [row ]))
0 commit comments