Advertisement
Guest User

Untitled

a guest
Aug 24th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.59 KB | None | 0 0
  1. import dash
  2. import dash_core_components as dcc
  3. import dash_html_components as html
  4. from dash.dependencies import Input, Output
  5. import plotly.graph_objs as go
  6. import pandas as pd
  7. import numpy as np
  8. from math import ceil
  9. from math import floor
  10.  
  11. df = pd.DataFrame(np.random.randn(10000, 10000))
  12.  
  13. selected_x0 = 0
  14. selected_x1 = len(df.columns)
  15. selected_y0 = 0
  16. selected_y1 = len(df.index)
  17.  
  18. def select_df(selection):
  19. global selected_x0
  20. global selected_x1
  21. global selected_y0
  22. global selected_y1
  23.  
  24. if 'xaxis.range[0]' in selection and 'xaxis.range[1]' in selection:
  25. x0 = int(floor((selection['xaxis.range[0]'])))
  26. x1 = int(ceil((selection['xaxis.range[1]'])))
  27. selected_x0 = max(x0, 0)
  28. selected_x1 = min(x1, len(df.columns))
  29. elif not selection or 'xaxis.autorange' in selection:
  30. selected_x0 = 0
  31. selected_x1 = len(df.columns)
  32.  
  33. if 'yaxis.range[0]' in selection and 'yaxis.range[1]' in selection:
  34. y0 = int(floor((selection['yaxis.range[0]'])))
  35. y1 = int(ceil((selection['yaxis.range[1]'])))
  36. selected_y0 = max(y0, 0)
  37. selected_y1 = min(y1, len(df.columns))
  38. elif not selection or 'yaxis.autorange' in selection:
  39. selected_y0 = 0
  40. selected_y1 = len(df.index)
  41.  
  42. if selected_x1 - selected_x0 <= 11:
  43. x_scale = 1
  44. else:
  45. x_scale = int(ceil(selected_x1 - selected_x0) / 10)
  46. x_scale = int(2 * round(x_scale / 2))
  47. selected_x0 = int(floor(selected_x0 / x_scale))
  48. selected_x1 = int(ceil(selected_x1 / x_scale))
  49. selected_x0 *= x_scale
  50. selected_x1 *= x_scale
  51. if selected_x1 > len(df.columns):
  52. selected_x1 = len(df.columns)
  53. selected_x0 = selected_x1 - x_scale * 10
  54. assert selected_x0 >= 0
  55.  
  56. if selected_y1 - selected_y0 <= 11:
  57. y_scale = 1
  58. else:
  59. y_scale = int(ceil(selected_y1 - selected_y0) / 10)
  60. y_scale = int(2 * round(y_scale / 2))
  61. selected_y0 = int(floor(selected_y0 / y_scale))
  62. selected_y1 = int(ceil(selected_y1 / y_scale))
  63. selected_y0 *= y_scale
  64. selected_y1 *= y_scale
  65. if selected_y1 > len(df.columns):
  66. selected_y1 = len(df.columns)
  67. selected_y0 = selected_y1 - y_scale * 10
  68. assert selected_y0 >= 0
  69.  
  70. selected_df = df.iloc[range(selected_y0, selected_y1), range(selected_x0, selected_x1)]
  71.  
  72. if x_scale > 1:
  73. x_groups = np.array([x_scale * (column // x_scale)
  74. for column in range(len(selected_df.columns))])
  75. selected_df = selected_df.groupby(by=x_groups, axis=1, sort=False).mean()
  76. selected_df.set_axis([int(ceil(selected_x0 + x_scale * (column + 0.5)))
  77. for column in range(len(selected_df.columns))],
  78. axis=1, inplace=True)
  79.  
  80. if y_scale > 1:
  81. y_groups = np.array([y_scale * (index // y_scale)
  82. for index in range(len(selected_df.index))])
  83. selected_df = selected_df.groupby(by=y_groups, axis=0, sort=False).mean()
  84. selected_df.set_axis([int(ceil(selected_y0 + y_scale * (index + 0.5)))
  85. for index in range(len(selected_df.index))],
  86. axis=0, inplace=True)
  87.  
  88. return selected_df
  89.  
  90. app = dash.Dash(__name__)
  91.  
  92. selected_df = select_df({})
  93. figure = {
  94. 'data': [{
  95. 'x': selected_df.columns,
  96. 'y': selected_df.index,
  97. 'z': selected_df.values,
  98. 'type': 'heatmap',
  99. }],
  100. 'layout': {
  101. 'xaxis': {
  102. 'scaleanchor': 'y',
  103. }
  104. },
  105. }
  106.  
  107. app.layout = html.Div(
  108. style={
  109. 'background-color': 'red',
  110. 'height': '100vmin',
  111. 'width': '100vmin',
  112. 'overflow': 'hidden',
  113. 'position': 'relative',
  114. },
  115. children=[
  116. # dcc.Loading(children=[ # WILL NOT WORK
  117. dcc.Graph(
  118. id='graph',
  119. figure=figure,
  120. style={
  121. 'position': 'absolute',
  122. 'top': 0,
  123. 'left': 0,
  124. 'background-color': 'blue',
  125. 'width': '100%',
  126. 'height': '100%',
  127. 'overflow': 'hidden',
  128. },
  129. ),
  130. # ]),
  131. ],
  132. )
  133.  
  134. @app.callback(Output('graph', 'figure'),
  135. [Input('graph', 'relayoutData')])
  136. def selected_df_figure(selection):
  137. selected_df = select_df(selection or {})
  138. figure['data'][0]['x'] = selected_df.columns
  139. figure['data'][0]['y'] = selected_df.index
  140. figure['data'][0]['z'] = selected_df.values
  141. return figure
  142.  
  143. if __name__ == '__main__':
  144. app.run_server(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement