Skip to content

Commit fe669a0

Browse files
committed
dtick forced at 10 per axis
1 parent 4856988 commit fe669a0

File tree

1 file changed

+52
-47
lines changed

1 file changed

+52
-47
lines changed

plotly/figure_factory/_facet_grid.py

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
LEGEND_BORDER_WIDTH = 1
2424
LEGEND_ANNOT_X = 1.05
2525
LEGEND_ANNOT_Y = 0.5
26-
DTICK = 1
26+
MAX_TICKS_PER_AXIS = 10
2727

2828
def _return_label(original_label, facet_labels, facet_var):
2929
if isinstance(facet_labels, dict):
@@ -594,8 +594,8 @@ def create_facet_grid(df, x, y, facet_row=None, facet_col=None,
594594
:param (int) height: the height of the facet grid figure.
595595
:param (int) width: the width of the facet grid figure.
596596
: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'.
599599
:param (str) scales: determines if axes have fixed ranges or not. Valid
600600
settings are 'fixed' (all axes fixed), 'free_x' (x axis free only),
601601
'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,
632632
"'scales' must be set to 'fixed', 'free_x', 'free_y' and 'free'."
633633
)
634634

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+
)
639639

640640
# make sure dataframe index starts at 0
641641
df.index = range(len(df))
@@ -810,48 +810,53 @@ def create_facet_grid(df, x, y, facet_row=None, facet_col=None,
810810
elif 'yaxis' in key:
811811
axis_labels['y'].append(key)
812812

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 = []
820821

821822
# 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:
855860
for key in fig['layout']:
856861
if '{}axis'.format(x_y) in key and range_are_numbers:
857862
fig['layout'][key]['range'] = [min_range, max_range]

0 commit comments

Comments
 (0)