Dash⑪(複数コンポーネントの配置/外部css)

外部cssを使ったスタイル設定

今回は外部cssを使って、複数コンポーネントを配置します。

まずは、下記のようにcssを定義します。

Divコンポーネントのスタイルを設定するcss(①②)と、横並びにするcss(③)を定義しています。

[ソースコード]

assets/style.css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* ①みどり色の長方形 */
.green_square {
width:40%;
height:200px;
background-color:green;
margin:2%;
}

/* ②スカイブルーの長方形 */
.skyblue_square {
width:27%;
height:200px;
background-color:skyblue;
margin:2%;
}

/* ③要素を横並びにする */
.columns {
float:left;
}

上記のcssファイルは、assetsフォルダの配下に格納しておきます。

次に、外部cssを参照するDashアプリケーションを作成します。

各コンポーネントのclassName属性に対応するcssのクラス名を渡し、各コンポーネントのスタイルを設定します。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import dash
import dash_html_components as html

app = dash.Dash(__name__) # Dashインスタンスを生成

app.layout = html.Div(
[
html.H1('5つの長方形を並べたアプリケーション'),
# 1行目、2つの長方形
html.Div(
[html.Div(className='green_square columns'),
html.Div(className='green_square columns')]
),
# 1行目、2つの長方形
html.Div(
[html.Div(className='skyblue_square columns'),
html.Div(className='skyblue_square columns'),
html.Div(className='skyblue_square columns')]
)
]
)

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

外部cssを使って、複数のDivコンポーネントを配置することができました。

Dash⑩(複数コンポーネントの配置/引数 style)

複数Divコンポーネントの配置

2種類の長方形スタイルを定義し、1行目に2つ、2行目に3つの長方形を表示してみます。

Divコンポーネントに複数のDivコンポーネントをリストで設定することで、複数コンポーネントを配置することができます。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import dash
import dash_html_components as html

app = dash.Dash(__name__) # Dashインスタンスを生成

style1 = {
'width':'40%', # 横幅
'height':'200px', # 高さ
'backgroundColor':'green', # 背景色
'margin':'2%', # マージン
'display':'inline-block' # 横並びにする
}

style2 = {
'width':'27%', # 横幅
'height':'200px', # 高さ
'backgroundColor':'skyblue',# 背景色
'margin':'2%', # マージン
'display':'inline-block' # 横並びにする
}

app.layout = html.Div(
[
# 1行目、2つの長方形
html.Div(
[html.Div(style=style1), html.Div(style=style1)],
id='first_leader'
),
# 2行目、3つの長方形
html.Div(
[html.Div(style=style2), html.Div(style=style2), html.Div(style=style2)],
id='second_leader'
)
],
id='leader'
)

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

複数のDivコンポーネントを配置することができました。

Dash⑨(複数コンポーネントの配置/引数 style)

複数コンポーネントの配置

Dashで、複数のコンポーネントを配置するには、下記の3種類の方法があります。

  • Divコンポーネントの引数 styleを使う。
  • 外部cssを使う。
  • Divコンポーネントにコンポーネントを渡す。

Divコンポーネントの引数 styleを使った配置

今回は引数 styleを使った複数コンポーネントの配置を試していきます。

まずは、Divコンポーネントを確認しやすくするために、cssを用いて形や色を設定します。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import dash
import dash_html_components as html

app = dash.Dash(__name__) # Dashインスタンスを生成

app.layout = html.Div(
# スタイルを設定
style = {
'width':'400px', # 横幅
'height':'250px', # 高さ
'backgroundColor':'yellow', # 背景色
'margin':'50px auto 50px' # マージン領域を上下50pxにして、中央寄せ
}
)

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

黄色の長方形(Divコンポーネント)がブラウザの中央に表示されました。

次回は、今回のように色付けしたDivコンポーネントを複数配置します。

Dash⑧(グラフの配置/plotly.py)

plotly.py

plotly.pyを使って、散布図を表示してみます。

前回記事同様、gapminderデータセットの2007年分データを利用します。

plotly.pyのFigureオブジェクトを作成し(10~28行目)、Graphコンポーネントの引数 figureに設定しています。

大陸ごとにScatter関数を実行し、グループ化しています。(凡例の大陸を選択することで表示/非表示を切替可能です)

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import dash
import dash_core_components as dcc
import plotly
import plotly.graph_objects as go

gapminder = plotly.data.gapminder()
gapminder2007 = gapminder[gapminder["year"] == 2007]

# figureの作成
fig = go.Figure()
for c in gapminder2007.continent.unique():
fig.add_trace(
go.Scatter(
x=gapminder2007.loc[gapminder2007['continent'] == c, 'gdpPercap'],
y=gapminder2007.loc[gapminder2007['continent'] == c, 'pop'],
name=c,
mode='markers',
marker={
'size': gapminder2007.loc[gapminder2007['continent'] == c, 'lifeExp'] / 2
},
text=gapminder2007.loc[gapminder2007['continent'] == c, 'country']
)
)
fig.update_layout(
xaxis={'type': 'log', 'title': 'gdpPercap'},
yaxis={'type': 'log', 'title': 'pop'},
title='Gapminder'
)

app = dash.Dash(__name__) # Dashインスタンスを生成

app.layout = dcc.Graph(
figure=fig
)

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

Dashアプリケーションで、plotly.pyを使い散布図を表示することができました。

Dash⑧(グラフの配置/Plotly Express)

Dashアプリケーションでは、Graphコンポーネント引数 figureにfigureを設定してグラフを作成します。

Plotly Express

Plotly Expressを使って、散布図を表示してみます。

gapminderデータセットの2007年分データを利用し、散布図の各要素を次のように設定します。

  • X軸
    一人当たりのGDP “gdpPercap”
  • Y軸
    人口 “pop”
  • マーカーサイズ
    平均寿命 “lifeExp”
  • カラースケール
    大陸名 “continent”
  • ホバーツール
    国名 “country”

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import dash
import dash_core_components as dcc
import plotly.express as px

gapminder = px.data.gapminder()
gapminder2007 = gapminder[gapminder["year"] == 2007]

app = dash.Dash(__name__) # Dashインスタンスを生成

app.layout = dcc.Graph(
figure=px.scatter(
gapminder2007, # データセット
x="gdpPercap", # X軸
y="pop", # Y軸
size="lifeExp", # マーカーサイズ
color="continent", # カラースケール
hover_name="country",
log_x=True, # X軸を対数に設定
log_y=True, # Y軸を対数に設定
title="Gapminder 2007" # タイトル
)
)

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

scatter関数で作成したfigureを、Graphコンポーネントの引数 figureに設定しています。

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

Dashアプリケーションで、Plotly Expressを使い散布図を表示することができました。

Dash⑦(コンポーネントの属性)

コンポーネントの属性

Dashの各コンポーネントは多くの属性を持ちます。

下記は、よく使われる属性の一覧です。

属性名 役割
children 見出しの文字。Divクラスでリストに格納した複数のコンポーネントなど子要素を設定。
id コンポーネントのID名の設定。コールバックで利用。
className クラス名。HTMLのclassグローバル属性の役割。(Pythonのクラスとは異なる)
options Dropdownクラスなどの選択肢の設定。
style スタイル設定。(辞書にcssを格納して渡す)
value コンポーネントの値

コンポーネントの属性の調べ方

Dashにはコンポーネントを作成するための多数のクラスがあり、それぞれが多くの属性を持ちます。

コンポーネントの役割や引数はhelp関数で確認することができます。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
import dash
import dash_html_components
import dash_core_components
import dash_daq # インストールされていない場合は、[pip install dash_daq]を実行

help(dash_html_components.Div)
print('######################################')
help(dash_core_components.Graph)
print('######################################')
help(dash_daq.ColorPicker)

[実行結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
Help on class Div in module dash.html.Div:

class Div(dash.development.base_component.Component)
| Div(children=None, id=undefined, n_clicks=undefined, n_clicks_timestamp=undefined, key=undefined, role=undefined, accessKey=undefined, className=undefined, contentEditable=undefined, contextMenu=undefined, dir=undefined, draggable=undefined, hidden=undefined, lang=undefined, spellCheck=undefined, style=undefined, tabIndex=undefined, title=undefined, loading_state=undefined, **kwargs)
|
| A Div component.
| Div is a wrapper for the <div> HTML5 element.
| For detailed attribute info see:
| https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div
|
| Keyword arguments:
|
| - children (a list of or a singular dash component, string or number; optional):
| The children of this component.
|
| - id (string; optional):
| The ID of this component, used to identify dash components in
| callbacks. The ID needs to be unique across all of the components
| in an app.
|
| - accessKey (string; optional):
| Keyboard shortcut to activate or add focus to the element.
|
| - aria-* (string; optional):
| A wildcard aria attribute.
|
| - className (string; optional):
| Often used with CSS to style elements with common properties.
|
| - contentEditable (string; optional):
| Indicates whether the element's content is editable.
|
| - contextMenu (string; optional):
| Defines the ID of a <menu> element which will serve as the
| element's context menu.
|
| - data-* (string; optional):
| A wildcard data attribute.
|
| - dir (string; optional):
| Defines the text direction. Allowed values are ltr (Left-To-Right)
| or rtl (Right-To-Left).
|
| - draggable (string; optional):
| Defines whether the element can be dragged.
|
| - hidden (a value equal to: 'hidden', 'HIDDEN' | boolean; optional):
| Prevents rendering of given element, while keeping child elements,
| e.g. script elements, active.
|
| - key (string; optional):
| A unique identifier for the component, used to improve performance
| by React.js while rendering components See
| https://reactjs.org/docs/lists-and-keys.html for more info.
|
| - lang (string; optional):
| Defines the language used in the element.
|
| - loading_state (dict; optional):
| Object that holds the loading state object coming from
| dash-renderer.
|
| `loading_state` is a dict with keys:
|
| - component_name (string; optional):
| Holds the name of the component that is loading.
|
| - is_loading (boolean; optional):
| Determines if the component is loading or not.
|
| - prop_name (string; optional):
| Holds which property is loading.
|
| - n_clicks (number; default 0):
| An integer that represents the number of times that this element
| has been clicked on.
|
| - n_clicks_timestamp (number; default -1):
| An integer that represents the time (in ms since 1970) at which
| n_clicks changed. This can be used to tell which button was
| changed most recently.
|
| - role (string; optional):
| The ARIA role attribute.
|
| - spellCheck (string; optional):
| Indicates whether spell checking is allowed for the element.
|
| - style (dict; optional):
| Defines CSS styles which will override styles previously set.
|
| - tabIndex (string; optional):
| Overrides the browser's default tab order and follows the one
| specified instead.
|
| - title (string; optional):
| Text to be displayed in a tooltip when hovering over the element.
|
| Method resolution order:
| Div
| dash.development.base_component.Component
| builtins.object
|
| Methods defined here:
|
| __init__ = wrapper(self, children=None, id=undefined, n_clicks=undefined, n_clicks_timestamp=undefined, key=undefined, role=undefined, accessKey=undefined, className=undefined, contentEditable=undefined, contextMenu=undefined, dir=undefined, draggable=undefined, hidden=undefined, lang=undefined, spellCheck=undefined, style=undefined, tabIndex=undefined, title=undefined, loading_state=undefined, **kwargs)
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| __abstractmethods__ = frozenset()
|
| ----------------------------------------------------------------------
| Methods inherited from dash.development.base_component.Component:
|
| __delitem__(self, id)
| Delete items by ID in the tree of children.
|
| __getitem__(self, id)
| Recursively find the element with the given ID through the tree of
| children.
|
| __iter__(self)
| Yield IDs in the tree of children.
|
| __len__(self)
| Return the number of items in the tree.
|
| __repr__(self)
| Return repr(self).
|
| __setitem__(self, id, item)
| Set an element by its ID.
|
| to_plotly_json(self)
|
| ----------------------------------------------------------------------
| Data descriptors inherited from dash.development.base_component.Component:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
|
| ----------------------------------------------------------------------
| Data and other attributes inherited from dash.development.base_component.Component:
|
| REQUIRED = required
|
| UNDEFINED = undefined

######################################
Help on class Graph in module dash.dcc.Graph:

class Graph(dash.development.base_component.Component)
| Graph(id=undefined, responsive=undefined, clickData=undefined, clickAnnotationData=undefined, hoverData=undefined, clear_on_unhover=undefined, selectedData=undefined, relayoutData=undefined, extendData=undefined, prependData=undefined, restyleData=undefined, figure=undefined, style=undefined, className=undefined, mathjax=undefined, animate=undefined, animation_options=undefined, config=undefined, loading_state=undefined, **kwargs)
|
| A Graph component.
| Graph can be used to render any plotly.js-powered data visualization.
|
| You can define callbacks based on user interaction with Graphs such as
| hovering, clicking or selecting
|
| Keyword arguments:
|
| - id (string; optional):
| The ID of this component, used to identify dash components in
| callbacks. The ID needs to be unique across all of the components
| in an app.
|
| - animate (boolean; default False):
| Beta: If True, animate between updates using plotly.js's `animate`
| function.
|
| - animation_options (dict; default { frame: { redraw: False, }, transition: { duration: 750, ease: 'cubic-in-out', },}):
| Beta: Object containing animation settings. Only applies if
| `animate` is `True`.
|
| - className (string; optional):
| className of the parent div.
|
| - clear_on_unhover (boolean; default False):
| If True, `clear_on_unhover` will clear the `hoverData` property
| when the user "unhovers" from a point. If False, then the
| `hoverData` property will be equal to the data from the last point
| that was hovered over.
|
| - clickAnnotationData (dict; optional):
| Data from latest click annotation event. Read-only.
|
| - clickData (dict; optional):
| Data from latest click event. Read-only.
|
| - config (dict; optional):
| Plotly.js config options. See
| https://plotly.com/javascript/configuration-options/ for more
| info.
|
| `config` is a dict with keys:
|
| - autosizable (boolean; optional):
| DO autosize once regardless of layout.autosize (use default
| width or height values otherwise).
|
| - displayModeBar (a value equal to: true, false, 'hover'; optional):
| Display the mode bar (True, False, or 'hover').
|
| - displaylogo (boolean; optional):
| Add the plotly logo on the end of the mode bar.
|
| - doubleClick (a value equal to: false, 'reset', 'autosize', 'reset+autosize'; optional):
| Double click interaction (False, 'reset', 'autosize' or
| 'reset+autosize').
|
| - doubleClickDelay (number; optional):
| Delay for registering a double-click event in ms. The minimum
| value is 100 and the maximum value is 1000. By default this is
| 300.
|
| - editable (boolean; optional):
| We can edit titles, move annotations, etc - sets all pieces of
| `edits` unless a separate `edits` config item overrides
| individual parts.
|
| - edits (dict; optional):
| A set of editable properties.
|
| `edits` is a dict with keys:
|
| - annotationPosition (boolean; optional):
| The main anchor of the annotation, which is the text (if
| no arrow) or the arrow (which drags the whole thing
| leaving the arrow length & direction unchanged).
|
| - annotationTail (boolean; optional):
| Just for annotations with arrows, change the length and
| direction of the arrow.
|
| - annotationText (boolean; optional)
|
| - axisTitleText (boolean; optional)
|
| - colorbarPosition (boolean; optional)
|
| - colorbarTitleText (boolean; optional)
|
| - legendPosition (boolean; optional)
|
| - legendText (boolean; optional):
| Edit the trace name fields from the legend.
|
| - shapePosition (boolean; optional)
|
| - titleText (boolean; optional):
| The global `layout.title`.
|
| - fillFrame (boolean; optional):
| If we DO autosize, do we fill the container or the screen?.
|
| - frameMargins (number; optional):
| If we DO autosize, set the frame margins in percents of plot
| size.
|
| - linkText (string; optional):
| Text appearing in the sendData link.
|
| - locale (string; optional):
| The locale to use. Locales may be provided with the plot
| (`locales` below) or by loading them on the page, see:
| https://github.com/plotly/plotly.js/blob/master/dist/README.md#to-include-localization.
|
| - locales (dict; optional):
| Localization definitions, if you choose to provide them with
| the plot rather than registering them globally.
|
| - mapboxAccessToken (boolean | number | string | dict | list; optional):
| Mapbox access token (required to plot mapbox trace types) If
| using an Mapbox Atlas server, set this option to '', so that
| plotly.js won't attempt to authenticate to the public Mapbox
| server.
|
| - modeBarButtons (boolean | number | string | dict | list; optional):
| Fully custom mode bar buttons as nested array, where the outer
| arrays represents button groups, and the inner arrays have
| buttons config objects or names of default buttons.
|
| - modeBarButtonsToAdd (list; optional):
| Add mode bar button using config objects.
|
| - modeBarButtonsToRemove (list; optional):
| Remove mode bar button by name. All modebar button names at
| https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js
| Common names include: sendDataToCloud; (2D) zoom2d, pan2d,
| select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d,
| resetScale2d; (Cartesian) hoverClosestCartesian,
| hoverCompareCartesian; (3D) zoom3d, pan3d, orbitRotation,
| tableRotation, handleDrag3d, resetCameraDefault3d,
| resetCameraLastSave3d, hoverClosest3d; (Geo) zoomInGeo,
| zoomOutGeo, resetGeo, hoverClosestGeo; hoverClosestGl2d,
| hoverClosestPie, toggleHover, resetViews.
|
| - plotGlPixelRatio (number; optional):
| Increase the pixel ratio for Gl plot images.
|
| - plotlyServerURL (string; optional):
| Base URL for a Plotly cloud instance, if `showSendToCloud` is
| enabled.
|
| - queueLength (number; optional):
| Set the length of the undo/redo queue.
|
| - responsive (boolean; optional):
| Whether to change layout size when the window size changes.
|
| - scrollZoom (boolean; optional):
| Mousewheel or two-finger scroll zooms the plot.
|
| - sendData (boolean; optional):
| If we show a link, does it contain data or just link to a
| plotly file?.
|
| - showAxisDragHandles (boolean; optional):
| Enable axis pan/zoom drag handles.
|
| - showAxisRangeEntryBoxes (boolean; optional):
| Enable direct range entry at the pan/zoom drag points (drag
| handles must be enabled above).
|
| - showEditInChartStudio (boolean; optional):
| Should we show a modebar button to send this data to a Plotly
| Chart Studio plot. If both this and showSendToCloud are
| selected, only showEditInChartStudio will be honored. By
| default this is False.
|
| - showLink (boolean; optional):
| Link to open this plot in plotly.
|
| - showSendToCloud (boolean; optional):
| Should we include a modebar button to send this data to a
| Plotly Cloud instance, linked by `plotlyServerURL`. By default
| this is False.
|
| - showTips (boolean; optional):
| New users see some hints about interactivity.
|
| - staticPlot (boolean; optional):
| No interactivity, for export or image generation.
|
| - toImageButtonOptions (dict; optional):
| Modifications to how the toImage modebar button works.
|
| `toImageButtonOptions` is a dict with keys:
|
| - filename (string; optional):
| The name given to the downloaded file.
|
| - format (a value equal to: 'jpeg', 'png', 'webp', 'svg'; optional):
| The file format to create.
|
| - height (number; optional):
| Height of the downloaded file, in px.
|
| - scale (number; optional):
| Extra resolution to give the file after rendering it with
| the given width and height.
|
| - width (number; optional):
| Width of the downloaded file, in px.
|
| - topojsonURL (string; optional):
| URL to topojson files used in geo charts.
|
| - watermark (boolean; optional):
| Add the plotly logo even with no modebar.
|
| - extendData (list | dict; optional):
| Data that should be appended to existing traces. Has the form
| `[updateData, traceIndices, maxPoints]`, where `updateData` is an
| object containing the data to extend, `traceIndices` (optional) is
| an array of trace indices that should be extended, and `maxPoints`
| (optional) is either an integer defining the maximum number of
| points allowed or an object with key:value pairs matching
| `updateData` Reference the Plotly.extendTraces API for full usage:
| https://plotly.com/javascript/plotlyjs-function-reference/#plotlyextendtraces.
|
| - figure (dict; default { data: [], layout: {}, frames: [],}):
| Plotly `figure` object. See schema:
| https://plotly.com/javascript/reference `config` is set
| separately by the `config` property.
|
| `figure` is a dict with keys:
|
| - data (list of dicts; optional)
|
| - frames (list of dicts; optional)
|
| - layout (dict; optional)
|
| - hoverData (dict; optional):
| Data from latest hover event. Read-only.
|
| - loading_state (dict; optional):
| Object that holds the loading state object coming from
| dash-renderer.
|
| `loading_state` is a dict with keys:
|
| - component_name (string; optional):
| Holds the name of the component that is loading.
|
| - is_loading (boolean; optional):
| Determines if the component is loading or not.
|
| - prop_name (string; optional):
| Holds which property is loading.
|
| - mathjax (boolean; default False):
| If True, loads mathjax v3 (tex-svg) into the page and use it in
| the graph.
|
| - prependData (list | dict; optional):
| Data that should be prepended to existing traces. Has the form
| `[updateData, traceIndices, maxPoints]`, where `updateData` is an
| object containing the data to prepend, `traceIndices` (optional)
| is an array of trace indices that should be prepended, and
| `maxPoints` (optional) is either an integer defining the maximum
| number of points allowed or an object with key:value pairs
| matching `updateData` Reference the Plotly.prependTraces API for
| full usage:
| https://plotly.com/javascript/plotlyjs-function-reference/#plotlyprependtraces.
|
| - relayoutData (dict; optional):
| Data from latest relayout event which occurs when the user zooms
| or pans on the plot or other layout-level edits. Has the form
| `{<attr string>: <value>}` describing the changes made. Read-only.
|
| - responsive (a value equal to: true, false, 'auto'; default 'auto'):
| If True, the Plotly.js plot will be fully responsive to window
| resize and parent element resize event. This is achieved by
| overriding `config.responsive` to True, `figure.layout.autosize`
| to True and unsetting `figure.layout.height` and
| `figure.layout.width`. If False, the Plotly.js plot not be
| responsive to window resize and parent element resize event. This
| is achieved by overriding `config.responsive` to False and
| `figure.layout.autosize` to False. If 'auto' (default), the Graph
| will determine if the Plotly.js plot can be made fully responsive
| (True) or not (False) based on the values in `config.responsive`,
| `figure.layout.autosize`, `figure.layout.height`,
| `figure.layout.width`. This is the legacy behavior of the Graph
| component. Needs to be combined with appropriate dimension /
| styling through the `style` prop to fully take effect.
|
| - restyleData (list; optional):
| Data from latest restyle event which occurs when the user toggles
| a legend item, changes parcoords selections, or other trace-level
| edits. Has the form `[edits, indices]`, where `edits` is an object
| `{<attr string>: <value>}` describing the changes made, and
| `indices` is an array of trace indices that were edited.
| Read-only.
|
| - selectedData (dict; optional):
| Data from latest select event. Read-only.
|
| - style (dict; optional):
| Generic style overrides on the plot div.
|
| Method resolution order:
| Graph
| dash.development.base_component.Component
| builtins.object
|
| Methods defined here:
|
| __init__ = wrapper(self, id=undefined, responsive=undefined, clickData=undefined, clickAnnotationData=undefined, hoverData=undefined, clear_on_unhover=undefined, selectedData=undefined, relayoutData=undefined, extendData=undefined, prependData=undefined, restyleData=undefined, figure=undefined, style=undefined, className=undefined, mathjax=undefined, animate=undefined, animation_options=undefined, config=undefined, loading_state=undefined, **kwargs)
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| __abstractmethods__ = frozenset()
|
| ----------------------------------------------------------------------
| Methods inherited from dash.development.base_component.Component:
|
| __delitem__(self, id)
| Delete items by ID in the tree of children.
|
| __getitem__(self, id)
| Recursively find the element with the given ID through the tree of
| children.
|
| __iter__(self)
| Yield IDs in the tree of children.
|
| __len__(self)
| Return the number of items in the tree.
|
| __repr__(self)
| Return repr(self).
|
| __setitem__(self, id, item)
| Set an element by its ID.
|
| to_plotly_json(self)
|
| ----------------------------------------------------------------------
| Data descriptors inherited from dash.development.base_component.Component:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
|
| ----------------------------------------------------------------------
| Data and other attributes inherited from dash.development.base_component.Component:
|
| REQUIRED = required
|
| UNDEFINED = undefined

######################################
Help on class ColorPicker in module builtins:

class ColorPicker(dash.development.base_component.Component)
| ColorPicker(id=undefined, value=undefined, disabled=undefined, size=undefined, theme=undefined, label=undefined, labelPosition=undefined, className=undefined, style=undefined, persistence=undefined, persisted_props=undefined, persistence_type=undefined, **kwargs)
|
| A ColorPicker component.
| A color picker.
|
| Keyword arguments:
|
| - id (string; optional):
| The ID used to identify the color picker in Dash callbacks.
|
| - className (string; optional):
| Class to apply to the root component element.
|
| - disabled (boolean; optional):
| If True, color cannot be picked.
|
| - label (dict; optional):
| Description to be displayed alongside the control. To control
| styling, pass an object with label and style properties.
|
| `label` is a string | dict with keys:
|
| - label (string; optional)
|
| - style (dict; optional)
|
| - labelPosition (a value equal to: 'top', 'bottom'; default 'top'):
| Where the indicator label is positioned.
|
| - persisted_props (list of a value equal to: 'value's; default ['value']):
| Properties whose user interactions will persist after refreshing
| the component or the page. Since only `value` is allowed this prop
| can normally be ignored.
|
| - persistence (boolean | string | number; optional):
| Used to allow user interactions in this component to be persisted
| when the component - or the page - is refreshed. If `persisted` is
| truthy and hasn't changed from its previous value, a `value` that
| the user has changed while using the app will keep that change, as
| long as the new `value` also matches what was given originally.
| Used in conjunction with `persistence_type`.
|
| - persistence_type (a value equal to: 'local', 'session', 'memory'; default 'local'):
| Where persisted user changes will be stored: memory: only kept in
| memory, reset on page refresh. local: window.localStorage, data is
| kept after the browser quit. session: window.sessionStorage, data
| is cleared once the browser quit.
|
| - size (number; default 225):
| Size (width) of the component in pixels.
|
| - style (dict; optional):
| Style to apply to the root component element.
|
| - theme (dict; default light):
| Theme configuration to be set by a ThemeProvider.
|
| - value (dict; optional):
| Color value of the picker.
|
| `value` is a dict with keys:
|
| - hex (string; optional):
| Hex string.
|
| - rbg (dict; optional):
| RGB/RGBA object.
|
| `rbg` is a dict with keys:
|
| - a (number; optional)
|
| - b (number; optional)
|
| - g (number; optional)
|
| - r (number; optional)
|
| Method resolution order:
| ColorPicker
| dash.development.base_component.Component
| object
|
| Methods defined here:
|
| __init__ = wrapper(self, id=undefined, value=undefined, disabled=undefined, size=undefined, theme=undefined, label=undefined, labelPosition=undefined, className=undefined, style=undefined, persistence=undefined, persisted_props=undefined, persistence_type=undefined, **kwargs)
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| __abstractmethods__ = frozenset()
|
| ----------------------------------------------------------------------
| Methods inherited from dash.development.base_component.Component:
|
| __delitem__(self, id)
| Delete items by ID in the tree of children.
|
| __getitem__(self, id)
| Recursively find the element with the given ID through the tree of
| children.
|
| __iter__(self)
| Yield IDs in the tree of children.
|
| __len__(self)
| Return the number of items in the tree.
|
| __repr__(self)
| Return repr(self).
|
| __setitem__(self, id, item)
| Set an element by its ID.
|
| to_plotly_json(self)
|
| ----------------------------------------------------------------------
| Data descriptors inherited from dash.development.base_component.Component:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
|
| ----------------------------------------------------------------------
| Data and other attributes inherited from dash.development.base_component.Component:
|
| REQUIRED = required
|
| UNDEFINED = undefined

Dash⑥(コールバック)

コールバックを使うと、Dashアプリケーションに対して動的な変更を行うことができます。

前回記事で作成したアプリケーションにコールバックを追加して、ドロップダウンで選択された色に背景色を変更してみます。

コールバック

Dashコールバックを設定するには、Dash.callbackデコレータでデコレートしたコールバック関数を定義します。(37~42行目)

コールバックの設定手順は下記の通りです。

  1. コールバック用のimport文追加。
  2. 入出力のコンポーネントにID追加。
  3. コールバック関数の定義。
    デコレータに対してコールバック関数の出力先入力を指定。(ID名と属性名を指定)
    コールバックは入力要素の指定された属性が変化するたびに呼び出されます。

今回定義したコールバック関数は、ドロップダウンで選択された色を背景色のcssプロパティに格納します。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.express as px
from dash.dependencies import Input, Output # 1. import追加

app = dash.Dash(__name__) # Dashインスタンスを生成

# 横幅を80%、中央寄せにし、上下に5%の余白
core_style = {'width':'80%', 'margin':'5% auto'}

app.layout = html.Div(
[
# 見出し
html.H1('こんにちは、Dash', style={'textAlign':'center'}),
# ドロップダウン
dcc.Dropdown(
id='dropdown', # 2. ID名を追加
options=[
{'label':'white', 'value':'white'},
{'label':'yellow', 'value':'yellow'}
],
value='white',
style=core_style
),
# グラフ
dcc.Graph(
figure = px.bar(x=[1, 2, 3, 4, 5],
y=[3, 4, 2, 5, 1]),
style=core_style
)
],
id='all-components' # 2. ID名を追加
)

# 3. コールバックを定義
@app.callback(
Output('all-components', 'style'), # 戻り値の出力先を設定
Input('dropdown', 'value') # コールバックの呼び出し要素を指定
)
def update_background(selected_value):
return {'backgroundColor':selected_value, 'padding':'3%'} # 返り値

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

ドロップボックスで色を選択すると、その色で背景色が変わるようになりました。

Dash⑤(レイアウト)

レイアウト

Dashでアプリケーションの見た目を調整するためには、コンポーネントを組み合わせてレイアウトを設定します。

次のコンポーネントを使って、タイトル、ドロップダウン、グラフを持つレイアウトを作成します。

  • Divコンポーネント(11行目)
  • H1コンポーネント(14行目)
  • Dropdownコンポーネント(16行目)
  • Graphコンポーネント(25行目)

複数のコンポーネントを持つレイアウトを作成するためには、Divコンポーネントを使います。

次のソースコードでは、3つのコンポーネントをリストに格納し、Divクラスの引数に設定しています。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.express as px

app = dash.Dash(__name__) # Dashインスタンスを生成

# 横幅を80%、中央寄せにし、上下に5%の余白
core_style = {'width':'80%', 'margin':'5% auto'}

app.layout = html.Div(
[
# 見出し
html.H1('こんにちは、Dash', style={'textAlign':'center'}),
# ドロップダウン
dcc.Dropdown(options=
[
{'label':'white', 'value':'white'},
{'label':'yellow', 'value':'yellow'}
],
value='white',
style=core_style
),
# グラフ
dcc.Graph(
figure = px.bar(x=[1, 2, 3, 4, 5],
y=[3, 4, 2, 5, 1]),
style=core_style
)
]
)

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

タイトル、ドロップダウン、グラフを持つレイアウトを表示することができました。

Dash④(グラフ作成)

グラフ作成

Dashでグラフを表示するには、Graphコンポーネントの引数 figureに、plotly.pyで作成したfigureを設定します。

次のコードでは、bar関数を使って、棒グラフを作成しています。(10~11行目)

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.express as px

app = dash.Dash(__name__) # Dashインスタンスを生成

app.layout = dcc.Graph(
# bar関数で棒グラフを作成
figure = px.bar(x=[1, 2, 3, 4, 5],
y=[3, 4, 2, 5, 1])
)

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

棒グラフを表示することができました。

Dash③(スタイル設定)

スタイル設定

Dashでは、コンポーネントの引数 styleに辞書型でcssを設定すると、スタイルを設定することができます。

キーがcssのプロパティをキャメルケースにしたもので、値がcssのプロパティ値となります。

(キャメルケースとは、2つ目以降の単語の1文字目を大文字にする命名規則です。
 例:background-color ⇒ backgroundColor)

下記のコードでは、文字色を赤色に変更し、横位置を中央に設定しています。(8行目)

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
import dash
import dash_html_components as html

app = dash.Dash(__name__) # Dashインスタンスを生成

# コンポーネントをlayout属性に設定
app.layout = html.H1('Hello Dash',
style={'color':'red', 'textAlign':'center'}) # スタイルを設定

if __name__ == '__main__':
app.run_server(debug=True) # アプリケーションを起動

上記ソースを実行すると、コンソールにURLが表示されるのでブラウザで表示します。

[ブラウザで表示]

スタイルを設定して表示することができました。