jupyter | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
New in 5.0, with support for pie, sunburst, icicle, funnelarea, and treemap charts in 5.15
Bar charts, histograms, polar bar charts, area charts, pie charts, sunburst charts, funnelarea charts, icicle charts, and treemap charts, have large markers or areas which support not only a fill color, but also an optional pattern (also known as "hatching" or "texture"). This can be used for a variety of reasons:
- to double-encode variables (i.e. using both color and pattern) to improve accessibility for visually-impaired end-users
- to encode an additional variable beyond just using color
- to make charts that are easier to print in black and white
the px.bar()
, px.histogram()
, px.bar_polar()
and px.area()
functions support the pattern_shape
argument. In the chart below, we double-encode nation
using color and pattern:
import plotly.express as px
df = px.data.medals_long()
fig = px.bar(df, x="medal", y="count", color="nation", pattern_shape="nation")
fig.show()
import plotly.express as px
df = px.data.medals_long()
fig = px.area(df, x="medal", y="count", color="nation", pattern_shape="nation")
fig.show()
In the chart below we use px.histogram()
instead of px.bar()
to aggregate multiple values together, and encode one variable (sex) using both color and x-position and another (smoker) using patterns:
import plotly.express as px
df = px.data.tips()
fig = px.histogram(df, x="sex", y="total_bill", color="sex", pattern_shape="smoker")
fig.show()
In the charts above, the first value of the variable assigned pattern_shape
gets the empty pattern, but this (and indeed every pattern-to-variable assignment) can be controlled using pattern_shape_sequence
and pattern_shape_map
, analogously to the way discrete colors can be mapped using Plotly Express.
Here we use pattern_shape_sequence
to replace the defaults and include a pattern-shape for the first variable:
import plotly.express as px
df = px.data.medals_long()
fig = px.bar(df, x="medal", y="count", color="nation",
pattern_shape="nation", pattern_shape_sequence=[".", "x", "+"])
fig.show()
Here we use pattern_shape_map
to explictly assign a shape to each value of nation
, regardless of order:
import plotly.express as px
df = px.data.medals_long()
fig = px.bar(df, x="medal", y="count", color="nation",
pattern_shape="nation", pattern_shape_map={
"China": ".", "Canada": "/", "South Korea": "+"
})
fig.show()
When creating figures meant to be printed on black and white printers, it is better to replace the fill-color with the pattern, rather than to overlay it. This can be controlled with the <trace>.marker.pattern.fillmode
attribute, which defaults to "overlay"
but can be set to "replace"
instead. Changing this attribute, and using a simpler default template and color scheme gives the following output:
import plotly.express as px
df = px.data.medals_long()
fig = px.bar(df, x="medal", y="count", color="nation",
pattern_shape="nation", pattern_shape_sequence=[".", "x", "+"],
template="simple_white"
)
fig.update_traces(
marker=dict(color="black", line_color="black", pattern_fillmode="replace")
)
fig.show()
Of course, this setting can be used without making the figure monochrome as well:
import plotly.express as px
df = px.data.medals_long()
fig = px.bar(df, x="medal", y="count", color="nation",
pattern_shape="nation", pattern_shape_sequence=[".", "x", "+"],
)
fig.update_traces(
marker=dict(line_color="grey", pattern_fillmode="replace")
)
fig.show()
If Plotly Express does not provide a good starting point, it is also possible to use the more generic go.Bar
class from plotly.graph_objects
.
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Bar(x=["a","b"], y=[1,2], marker_pattern_shape="."))
fig.add_trace(go.Bar(x=["a","b"], y=[3,1], marker_pattern_shape="x"))
fig.add_trace(go.Bar(x=["a","b"], y=[2,3], marker_pattern_shape="+"))
fig.show()
See https://plotly.com/python/reference/bar/ for more information and chart attribute options!