|
23 | 23 | LEGEND_BORDER_WIDTH = 1
|
24 | 24 | LEGEND_ANNOT_X = 1.05
|
25 | 25 | LEGEND_ANNOT_Y = 0.5
|
26 |
| -DTICK = 1 |
| 26 | +MAX_TICKS_PER_AXIS = 10 |
27 | 27 |
|
28 | 28 | def _return_label(original_label, facet_labels, facet_var):
|
29 | 29 | if isinstance(facet_labels, dict):
|
@@ -594,8 +594,8 @@ def create_facet_grid(df, x, y, facet_row=None, facet_col=None,
|
594 | 594 | :param (int) height: the height of the facet grid figure.
|
595 | 595 | :param (int) width: the width of the facet grid figure.
|
596 | 596 | :param (str) trace_type: decides the type of plot to appear in the
|
597 |
| - facet grid. The options are 'scatter' and 'scattergl'. The defualt is |
598 |
| - 'scatter'. |
| 597 | + facet grid. The options are 'scatter', 'scattergl' and 'bar'. The |
| 598 | + defualt trace type is 'scatter'. |
599 | 599 | :param (str) scales: determines if axes have fixed ranges or not. Valid
|
600 | 600 | settings are 'fixed' (all axes fixed), 'free_x' (x axis free only),
|
601 | 601 | 'free_y' (y axis free only) or 'free' (both axes free).
|
@@ -632,10 +632,10 @@ def create_facet_grid(df, x, y, facet_row=None, facet_col=None,
|
632 | 632 | "'scales' must be set to 'fixed', 'free_x', 'free_y' and 'free'."
|
633 | 633 | )
|
634 | 634 |
|
635 |
| - #if trace_type not in ['scatter', 'scattergl']: |
636 |
| - # raise exceptions.PlotlyError( |
637 |
| - # "'trace_type' must be either 'scatter' or 'scattergl'." |
638 |
| - # ) |
| 635 | + if trace_type not in ['scatter', 'scattergl', 'bar']: |
| 636 | + raise exceptions.PlotlyError( |
| 637 | + "'trace_type' must be either 'scatter', 'scattergl' or 'bar'." |
| 638 | + ) |
639 | 639 |
|
640 | 640 | # make sure dataframe index starts at 0
|
641 | 641 | df.index = range(len(df))
|
@@ -810,48 +810,53 @@ def create_facet_grid(df, x, y, facet_row=None, facet_col=None,
|
810 | 810 | elif 'yaxis' in key:
|
811 | 811 | axis_labels['y'].append(key)
|
812 | 812 |
|
813 |
| - # ticks |
814 |
| - for x_y in ['x', 'y']: |
815 |
| - for key in fig['layout']: |
816 |
| - if '{}axis'.format(x_y) in key: |
817 |
| - fig['layout'][key]['dtick'] = DTICK |
818 |
| - fig['layout'][key]['tickwidth'] = 1 |
819 |
| - fig['layout'][key]['ticklen'] = 4 |
| 813 | + if scales == 'fixed': |
| 814 | + fixed_axes = ['x', 'y'] |
| 815 | + elif scales == 'free_x': |
| 816 | + fixed_axes = ['y'] |
| 817 | + elif scales == 'free_y': |
| 818 | + fixed_axes = ['x'] |
| 819 | + else: |
| 820 | + fixed_axes = [] |
820 | 821 |
|
821 | 822 | # fixed ranges
|
822 |
| - if scales in ['fixed', 'free_x', 'free_y']: |
823 |
| - if scales == 'fixed': |
824 |
| - fixed_axes = ['x', 'y'] |
825 |
| - elif scales == 'free_x': |
826 |
| - fixed_axes = ['y'] |
827 |
| - elif scales == 'free_y': |
828 |
| - fixed_axes = ['x'] |
829 |
| - |
830 |
| - for x_y in fixed_axes: |
831 |
| - if len(axis_labels[x_y]) > 1: |
832 |
| - min_ranges = [] |
833 |
| - max_ranges = [] |
834 |
| - for trace in fig['data']: |
835 |
| - if len(trace[x_y]) > 0: |
836 |
| - min_ranges.append(min(trace[x_y])) |
837 |
| - max_ranges.append(max(trace[x_y])) |
838 |
| - while None in min_ranges: |
839 |
| - min_ranges.remove(None) |
840 |
| - while None in max_ranges: |
841 |
| - max_ranges.remove(None) |
842 |
| - |
843 |
| - min_range = min(min_ranges) |
844 |
| - max_range = max(max_ranges) |
845 |
| - |
846 |
| - range_are_numbers = (isinstance(min_range, Number) and |
847 |
| - isinstance(max_range, Number)) |
848 |
| - |
849 |
| - # floor and ceiling the range endpoints |
850 |
| - if range_are_numbers: |
851 |
| - min_range = math.floor(min_range) #- 1 |
852 |
| - max_range = math.ceil(max_range) #+ 1 |
853 |
| - |
854 |
| - # insert ranges into fig |
| 823 | + for x_y in ['x', 'y']: |
| 824 | + if len(axis_labels[x_y]) > 1: |
| 825 | + min_ranges = [] |
| 826 | + max_ranges = [] |
| 827 | + for trace in fig['data']: |
| 828 | + if len(trace[x_y]) > 0: |
| 829 | + min_ranges.append(min(trace[x_y])) |
| 830 | + max_ranges.append(max(trace[x_y])) |
| 831 | + while None in min_ranges: |
| 832 | + min_ranges.remove(None) |
| 833 | + while None in max_ranges: |
| 834 | + max_ranges.remove(None) |
| 835 | + |
| 836 | + min_range = min(min_ranges) |
| 837 | + max_range = max(max_ranges) |
| 838 | + |
| 839 | + range_are_numbers = (isinstance(min_range, Number) and |
| 840 | + isinstance(max_range, Number)) |
| 841 | + |
| 842 | + # floor and ceiling the range endpoints |
| 843 | + if range_are_numbers: |
| 844 | + min_range = math.floor(min_range) - 1 |
| 845 | + max_range = math.ceil(max_range) + 1 |
| 846 | + |
| 847 | + # dtick depends on number of points |
| 848 | + if range_are_numbers: |
| 849 | + dtick = int( (max_range - min_range) / MAX_TICKS_PER_AXIS ) |
| 850 | + else: |
| 851 | + dtick = 1 |
| 852 | + for key in fig['layout']: |
| 853 | + if '{}axis'.format(x_y) in key: |
| 854 | + fig['layout'][key]['dtick'] = dtick |
| 855 | + fig['layout'][key]['tickwidth'] = 1 |
| 856 | + fig['layout'][key]['ticklen'] = 4 |
| 857 | + |
| 858 | + # insert ranges into fig |
| 859 | + if x_y in fixed_axes: |
855 | 860 | for key in fig['layout']:
|
856 | 861 | if '{}axis'.format(x_y) in key and range_are_numbers:
|
857 | 862 | fig['layout'][key]['range'] = [min_range, max_range]
|
|
0 commit comments