Plotly Insights Nov 2024

Plotly Dash
Lessons Learned

I have built a few Plotly charts (using Plotly Dash) and have learned a few tricks along the way. Reading the docs will get you part of the way there but trial and error is required to go all the way.

Let’s start

  • You might need several traces
  • You might need custom hover text
  • You might need a larger font
  • You might need several traces
  • You might want to toggle trace visibility
  • You might need a special format for on screemn vs printing
  • You might want need custom grid colors
  • You might need annotations
  • You might need buttons
  • You might need to save the ‘live’ html chart
  • You might need several traces

I attach excerpts from my Python code. Follow along and read the comments.

The Plotly dictionary style seems to vary just a bit. For example, in my code, compare marker statements with annotations statements.

Also, it is not obvious how to refer to all the style attributes.

Hence: trial and error.

Hope this helps.


Here are the online Plotly for Python ocs; great examples are provided.


Screenshot



Live Link to the C2 App (to reference the live chart)


    #
	# PLOTLY DOCS
	#
	# read https://plotly.com/python/
	#
	
	#... SAMPLE TRACE
	
        trace_bt = go.Scatter(
        x=my_x[: save_my_count + 1],
        y=my_y[: save_my_count + 1],
        mode="lines+markers+text",
        text=my_text_plate_governs,
        
		# set a custom text for the hover
		customdata=my_text_all_plates,
        textposition="top left",
        textfont=dict(size=14, color="black"),
        opacity=1.0,
        name="",
        marker={"size": 12, "line": {"width": 1.5, "color": "#FF0000"}},
        line={"width": 2.0, "color": "#000000"},
        cliponaxis=False,

		# set a custom text for the hover (see a few line up)
		hovertemplate="Capacity: %{y} 
Thickness: %{customdata}", ) #... SAMPLE TRACE trace_bt4 = go.Scatter( x=[0, 0.25], # yes point at zero, then 0.25 (1st plate thickness) y=[0, my_y[0]], # yes point at zero, then 0.25 capacity (1st plate thickness) mode="lines+markers+text", text="", # set a custom text for the hover customdata=["0", "0.25"], opacity=0.2, name="", # Zero extension line marker={"symbol": "circle", "size": 8}, # 'line': {'width': 1.5, 'color': '#FF0000'}}, line={"width": 2.0, "color": "#000000", "dash": "dash"}, cliponaxis=False, # set a custom text for the hover (see a few line up) hovertemplate="Capacity: %{y}
Thickness: %{customdata}", visible=True, ) #... #combine the traces in preparation for building the figure data_wt = [trace_bt4, trace_bt, trace_bt3] #... LAYOUT layout_bt = go.Layout( autosize=True, margin=go.layout.Margin(l=50, r=50, t=50, b=50, pad=16), paper_bgcolor="rgba(237, 237, 237, 0.1)", plot_bgcolor="rgba(250, 240, 240, 0.3)", showlegend=False, xaxis={ "title": "Plate Thickness (inches)", "gridcolor": "#C8D4E3", "gridwidth": 1, "range": [0, max_x + 0.1], "visible": True, }, yaxis={ "title": "Bolt Capacity (kips)", "gridcolor": "#C8D4E3", "gridwidth": 1, "range": [0, max(my_y) * (1 + plotpadfactor / 2)], "rangemode": "nonnegative", "visible": True, }, annotations=[ dict( x=0.45, y=0.05, align="left", font={"family": "Arial", "size": 6}, text="", xref="paper", yref="paper", xanchor="left", yanchor="top", showarrow=False, ) ], ) # build the figure figure_bt = go.Figure(data=data_wt, layout=layout_bt) #... FIGURE UPDATES # small margin to 'fill up' graph horizontally xmargin = 0.01 figure_bt.update_layout(xaxis=dict(range=[0, min(2, max_x + xmargin)])) # set the hoverlabel look figure_bt.update_layout( hoverlabel=dict( bgcolor="#FFFFE0", font_size=18, font=dict(color="black"), bordercolor="#FF0000", ) ) # Update layout to change grid colors figure_bt.update_layout( xaxis=dict(gridcolor="#E8E8E8"), # Change x-axis grid color yaxis=dict(gridcolor="#696969"), # Change y-axis grid color ) #... BUTTONS MIGHT BE USEFUL # Add buttons figure_bt.update_layout( updatemenus=[ dict( # type='buttons', direction="down", buttons=list( [ dict( label="On screen", # # there are several methods # read https://plotly.com/python/custom-buttons/ # method="relayout", # if you wanted to toggle the visibility of certain traces (via the button) # only the 1st trace is visible # args=[{'visible': [True, False, False, False]}] # set the grid colors to a light color for the screen # no annotation in this view # tricky, because even with no annotations, # the arrow has to be explicily turned off args=[ { "annotations": [{"text": "", "showarrow": False}], "xaxis.gridcolor": "#E8E8E8", "yaxis.gridcolor": "#696969", "plot_bgcolor": "rgba(250, 240, 240, 0.3)", } ], ), dict( label="For printing", # # there are several methods # read https://plotly.com/python/custom-buttons/ # method="relayout", # if you wanted to toggle the visibility of certain traces (via the button) # only the 4th trace is visible # args=[{'visible': [False, False, False, True]}] # set the grid colors to a dark color for the paper printout # turn on the annotations in this view args=[ { "annotations": [ { "x": 0.03, "y": 0.98, "xref": "paper", "yref": "paper", "font": { "family": "Arial", "size": "8", "color": "red", }, "bgcolor": "white", "bordercolor": "#b9A9A9", "borderwidth": 1, # no arrows for this large text box "showarrow": False, "text": annotation_text, "xanchor": "left", "yanchor": "top", "align": "left", } ], "xaxis.gridcolor": "#DCDCDC", "yaxis.gridcolor": "#A9A9A9", "plot_bgcolor": "white", } ], ), ] ), ), ] ), # save a copy of the html for my blog figure_bt.write_html("DASH/pages/C2 chart.html")

Leave a Reply

Your email address will not be published. Required fields are marked *