@@ -517,7 +517,7 @@ def __init__(self, parent, data, readonly=False, bg_value=None, bg_gradient=None
517517 self .model_hlabels = LabelsArrayModel (parent = self , readonly = readonly )
518518 self .view_hlabels = LabelsView (parent = self , model = self .model_hlabels , position = (TOP , RIGHT ))
519519
520- self .model_vlabels = LabelsArrayModel (parent = self , readonly = readonly )
520+ self .model_vlabels = LabelsArrayModel (parent = self , readonly = readonly , orientation = Qt . Vertical )
521521 self .view_vlabels = LabelsView (parent = self , model = self .model_vlabels , position = (BOTTOM , LEFT ))
522522
523523 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
617617 self .bgcolor_checkbox = bgcolor
618618 btn_layout .addWidget (bgcolor )
619619
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+
620627 # Set widget layout
621628 layout = QVBoxLayout ()
622629 layout .addLayout (self .filters_layout )
@@ -702,7 +709,8 @@ def dropEvent(self, event):
702709
703710 def set_data (self , data , bg_gradient = None , bg_value = None ):
704711 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 )
706714
707715 # update filters
708716 la_data = self .data_adapter .get_data ()
@@ -721,11 +729,11 @@ def set_data(self, data, bg_gradient=None, bg_value=None):
721729
722730 # reset default size
723731 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 ()
726734 self .view_data .set_default_size ()
727735
728- def _update_digits_scientific (self , data ):
736+ def _update_digits_scientific_dims (self , data ):
729737 """
730738 data : LArray
731739 """
@@ -755,6 +763,9 @@ def _update_digits_scientific(self, data):
755763 self .bgcolor_checkbox .setChecked (self .model_data .bgcolor_enabled )
756764 self .bgcolor_checkbox .setEnabled (self .model_data .bgcolor_enabled )
757765
766+ self .nb_horizontal_dims_spinbox .setMinimum (1 )
767+ self .nb_horizontal_dims_spinbox .setMaximum (max (1 , self .data_adapter .ndim - 1 ))
768+
758769 def choose_scientific (self , data ):
759770 # max_digits = self.get_max_digits()
760771 # default width can fit 8 chars
@@ -887,7 +898,7 @@ def dirty(self):
887898 def accept_changes (self ):
888899 """Accept changes"""
889900 la_data = self .data_adapter .accept_changes ()
890- self ._update_digits_scientific (la_data )
901+ self ._update_digits_scientific_dims (la_data )
891902
892903 def reject_changes (self ):
893904 """Reject changes"""
@@ -912,10 +923,13 @@ def digits_changed(self, value):
912923 self .digits = value
913924 self .model_data .set_format (self .cell_format )
914925
926+ def nb_horizontal_dims_changed (self , value ):
927+ self .data_adapter .update_nb_dims_hlabels (value )
928+
915929 def create_filter_combo (self , axis ):
916930 def filter_changed (checked_items ):
917931 filtered = self .data_adapter .change_filter (axis , checked_items )
918- self ._update_digits_scientific (filtered )
932+ self ._update_digits_scientific_dims (filtered )
919933 combo = FilterComboBox (self )
920934 combo .addItems ([str (l ) for l in axis .labels ])
921935 combo .checkedItemsChanged .connect (filter_changed )
@@ -947,15 +961,15 @@ def _selection_data(self, headers=True, none_selects_all=True):
947961 if not self .data_adapter .ndim :
948962 return raw_data
949963 # 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()])
951965 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 ) ]
954968 if self .data_adapter .ndim == 1 :
955969 return chain (topheaders , [chain (['' ], row ) for row in raw_data ])
956970 else :
957971 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 )
959973 return chain (topheaders ,
960974 [chain ([vlabels [j ][r ] for j in range (len (vlabels ))], row )
961975 for r , row in enumerate (raw_data )])
@@ -1039,12 +1053,13 @@ def plot(self):
10391053 row_min , row_max , col_min , col_max = self .view_data ._selection_bounds ()
10401054 dim_names = self .data_adapter .get_axes_names ()
10411055 # 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 :
10481063 ylabels = [[]]
10491064
10501065 assert data .ndim == 2
@@ -1064,7 +1079,7 @@ def plot(self):
10641079 else :
10651080 # plot each row as a line
10661081 xlabel = dim_names [- 1 ]
1067- xticklabels = [str ( label ) for label in xlabels ]
1082+ xticklabels = [' \n ' . join ( row ) for row in xlabels ]
10681083 xdata = np .arange (col_max - col_min )
10691084 for row in range (len (data )):
10701085 ax .plot (xdata , data [row ], label = ' ' .join (ylabels [row ]))
0 commit comments