Facet_row_spacing увеличивается с увеличением рядов фасетовPython

Программы на Python
Anonymous
Facet_row_spacing увеличивается с увеличением рядов фасетов

Сообщение Anonymous »

Я уверен, что есть простое решение этой проблемы, но, копаясь в течение нескольких часов, я не смог найти ответ. Короче говоря, чем больше строк я добавляю в фасетную серию диаграмм рассеяния, тем больше разрыв между строками (несмотря на попытку жестко запрограммировать желаемую высоту промежутка между строками)
У меня есть кнопка панель мониторинга Dash, которая генерирует диаграмму рассеяния на основе данных, содержащихся в таблице:
[img]https://i.sstatic.net /UNmrKsEDl.png[/img]

Функция создания графика:

Код: Выделить всё

def generate_all_curves(unique_key_list):
hit_curve_data_df = df_curves[df_curves['Unique_key'].isin(unique_key_list)]
num_rows = math.ceil(len(unique_key_list)/2)
print("Num rows: "+str(num_rows))
facet_row_max_spacing = 1/num_rows
if facet_row_max_spacing > 0.04:
facet_row_max_spacing = 0.04
print("Spacing: "+str(facet_row_max_spacing))
all_curves_figure = px.scatter(hit_curve_data_df, x='Temps', y='Smooth Fluorescence', color='Subplot', color_discrete_sequence=['#FABF73','#F06D4E'],
hover_name='Well', hover_data={'Final_decision':False, 'Assay_Plate':False, 'Temps':False, 'Smooth Fluorescence':False, 'Error':True, 'Ctrl_Tm_z-score':True}, #Hover data (Tooltip in Spotfire)
facet_col='Unique_key', facet_col_wrap=2, facet_col_spacing=0.08,facet_row_spacing = facet_row_max_spacing,#Facet plots by plate and only allow 2 columns. Column spacing had to be adjusted to allow for individual y-axes
render_mode = 'auto', height = 200*num_rows) #Height of plots is equal to half the number of plates (coz 2 columns) with each plot 300px high. Width will have to be adjusted
return all_curves_figure
А затем обратный вызов для создания графиков на основе строк, присутствующих в таблице данных:

Код: Выделить всё

@app.callback(
Output('all_graphs_div', 'children'),
[Input('generate', 'n_clicks'),
Input('clear', 'n_clicks')],
[State('results_table_datatable', 'data')])
def update_or_clear_graphs(generate_clicks, clear_clicks, current_table_data):
ctx = callback_context
if not ctx.triggered:
raise PreventUpdate
trigger_id = ctx.triggered[0]['prop_id'].split('.')[0]
if trigger_id == 'generate':
if generate_clicks > 0:
key_list = [d['Unique_key'] for d in current_table_data]
new_figure = generate_all_curves(key_list)
new_figure.update_yaxes(matches=None)
new_figure.for_each_yaxis(lambda yaxis: yaxis.update(showticklabels=True))
new_figure.update_layout(height=200 * len(key_list)/2) #Each plot is 400px high (i.e. 200 is half of 400)
graph_object = dcc.Graph(id='all_graphs_object', figure=new_figure, style={'font-family': 'Arial'})
return graph_object
elif trigger_id == 'clear':
if clear_clicks > 0:
return None
raise PreventUpdate
И наконец, расположение этих объектов (только соответствующий раздел)

Код: Выделить всё

            #Child A: Data table
html.Div([
#Data table
html.Div([
dash_table.DataTable(
default_datatable.to_dict('records'),
[{'name': i, 'id': i} for i in default_datatable.loc[:, ['Source_Plate','Well','Subplot','Compound','Fraction','Final_Tm','No.  Std Dev','Relative_amplitude','Unique_key']]],
id = 'results_table_datatable',
hidden_columns=['Unique_key'],
css=[{'selector': '.show-hide', 'rule': 'display: none'},{'selector':'.export','rule': 'margin:5px'}],
row_deletable=True,
sort_action='native',
export_format='xlsx',
style_data_conditional=data_table_style_data_conditional,
style_table = {'height':'400px','overflow-y':'scroll'},
style_as_list_view=True, style_cell={'fontSize':12, 'font-family':'Arial'}, style_header = {'backgroundColor': '#cce6ff','fontWeight': 'bold'}),#Styling of table
], id = 'results_table'),
#Generate all hit graphs button
html.Div([html.Button('Generate all graphs', id='generate', n_clicks=None, style = {'margin-top':'20px', 'margin-right': '20px'})], style = {'display':'inline-block','vertical-align':'top'}),
#Clear all graphs button
html.Div([html.Button('Clear all graphs', id='clear', n_clicks=0, style = {'margin-top':'20px'})],style = {'display':'inline-block','vertical-align':'top'}),
#Div with the plots
html.Div([],id = 'all_graphs_div', style = {'height':'500px','overflow-y':'scroll'})
],
id='left_panel',
style = {'display':'inline-block','vertical-align':'top', 'width': '50%','overflow-y':'scroll','overflow-x':'scroll', 'height':'90%', 'padding':'10px','margin-top':'5px'}), #Styling of table container
Как вы увидите, я попытался динамически изменить параметр facet_row_spacing. Я стараюсь поддерживать значение 0,04, когда у меня всего несколько графиков, так как это выглядит наиболее эстетично. Как только оно опускается ниже этой отметки, я позволяю ему упасть до необходимого значения для работы.
Проблема возникает, когда я начинаю увеличивать количество участков. Несмотря на мои попытки определить расстояние между строками фасетов, кажется, что это пространство увеличивается с увеличением числа фасетных графиков.
Например. Вот графики, когда имеется 9 графиков (т. е. разделены на два столбца = 5 строк, интервал, по-видимому, установлен на 0,04):
[img]https://i.sstatic .net/3GFZBVull.png[/img]

Однако, когда я увеличиваю количество графиков до 18 (9 строк, интервал, очевидно, все еще установлен на 0,04 в соответствии с моими инструкциями по печати), но вы заметите, что пространство между каждым рядом графиков увеличилось.
Изображение

Все стало странно, когда я попытался увеличить количество строк до 56 (112 графиков), которые (согласно операторам печати) должны были иметь facet_row_spacing, равный 0,0178571429. Однако расстояние между рядами становится все больше и больше по мере увеличения количества участков или рядов участков.
[img]https: //i.sstatic.net/BcI5ABzul.png[/img]

Что, черт возьми, происходит и что я делаю неправильно, что такое странное обратное поведение? Есть ли что-то эквивалентное new_figure.update_layout(facet_row_spacing = x), которое я могу включить в обратный вызов?

Подробнее здесь: https://stackoverflow.com/questions/785 ... facet-rows

Вернуться в «Python»