知微见著, 通过解析柱状图(bar)来解析plot的绘图机制和各种参数使用, 以便于理解其整体的作业逻辑.
(参数的阵列有点吓人...)
plotly.express.bar(
data_frame=None,
x=None,
y=None,
color=None,
pattern_shape=None,
facet_row=None,
facet_col=None,
facet_col_wrap=0,
facet_row_spacing=None,
facet_col_spacing=None,
hover_name=None,
hover_data=None,
custom_data=None,
text=None, base=None,
error_x=None,
error_x_minus=None,
error_y=None,
error_y_minus=None,
animation_frame=None,
animation_group=None,
category_orders=None,
labels=None,
color_discrete_sequence=None,
color_discrete_map=None,
color_continuous_scale=None,
pattern_shape_sequence=None,
pattern_shape_map=None,
range_color=None,
color_continuous_midpoint=None,
opacity=None,
orientation=None,
barmode='relative',
log_x=False,
log_y=False,
range_x=None,
range_y=None,
text_auto=False,
title=None,
template=None,
width=None,
height=None) → plotly.graph_objects._figure.Figure
import plotly.express as px
import plotly.graph_objects as go
import plotly.io as pio
import pandas as pd
import numpy as np
import plotly.offline as po
# pio.renderers.default = "svg"
po.init_notebook_mode(connected=True)
df = pd.DataFrame(data = {
'a': [1,2,3],
'b': [10, 12, 5],
'e': [4, 7, 2],
'c': ['apple', 'orange', 'pie']
})
df
a | b | e | c | |
---|---|---|---|---|
0 | 1 | 10 | 4 | apple |
1 | 2 | 12 | 7 | orange |
2 | 3 | 5 | 2 | pie |
dfa = pd.DataFrame({
'a': ['ax', 'bx', 'cx'],
'b': [100, 1200, 400],
'c': [100.12554, 120.155, 412.1],
'e': ["Thur", "Fri", "Sat"]
})
dfa
a | b | c | e | |
---|---|---|---|---|
0 | ax | 100 | 100.12554 | Thur |
1 | bx | 1200 | 120.15500 | Fri |
2 | cx | 400 | 412.10000 | Sat |
iris = px.data.iris()
iris.head()
sepal_length | sepal_width | petal_length | petal_width | species | species_id | |
---|---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | 1 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | 1 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | 1 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | 1 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | 1 |
tips = px.data.tips()
tips.head()
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
data_frame
x
y
height
width
title
text
orientation
barmode
数据
标题
bar的展示方式
文本内容
bar的布局
图的大小空值
# 参数
# title, 标题
# height, 图高
# width, 图宽
# x, x轴
# y, y轴
px.bar(
x = [1,2,3],
y=[10, 12, 5],
title='test',
width=720,
height=360
)
# text, 设置bar上面显示的文本
# barmode, 改变bar的放置方式
px.bar(data_frame=df,
x='a',
y =['b', 'e'], # 可以传入多列数据
barmode='relative', # 默认设置
text='c',
width=720,
height=360
)
px.bar(data_frame=df,
x='a',
y =['b', 'e'],
text='c',
width=720,
height=360
)
# text
px.bar(data_frame=df,
x='a',
y =['b', 'e'],
barmode='overlay',
text='c',
width=720,
height=360
)
px.bar(data_frame=df,
x='a',
y =['b', 'e'],
barmode='group',
text='c',
width=720,
height=360
)
color_continuous_midpoint (number (default None)) – If set, computes the bounds of the continuous color scale to have the desired midpoint. Setting this value is recommended when using plotly.express.colors.diverging color scales as the inputs to color_continuous_scale.
# 注意侧边栏的柱子, 并不需要手动调用
# color
px.bar(data_frame=dfa,
x='b',
y ='a',
color='b',
width=720,
height=360,
orientation='h'
)
# color_discrete_sequence
px.bar(
data_frame=df,
x='a',
y='b',
color='c',
color_discrete_sequence=px.colors.sequential.RdBu,
width=720,
height=360
)
# color_discrete_sequence
px.bar(
data_frame=df,
x='a',
y='b',
color_discrete_sequence=px.colors.sequential.RdBu,
width=720,
height=360
)
# color_discrete_map
px.bar(
data_frame=df,
x='a',
y='b',
text='c',
color='c',
color_discrete_map={
'apple': 'red',
'pie': 'black',
'orange': 'orange'
},
width=720,
height=360
)
# range_color, 设置颜色的范围
fig = px.scatter(
iris,
x="sepal_width",
y="sepal_length",
color="sepal_length",
range_color=[5,8],
width=720,
height=360
)
fig.show()
fig = px.scatter(
iris,
x="sepal_width",
y="sepal_length",
color="sepal_length",
range_color=[2, 15],
width=720,
height=360
)
fig.show()
data_g = px.data.gapminder().query("year == 2007")
avg_lifeExp = (data_g['lifeExp'] * data_g['pop']).sum() / data_g['pop'].sum()
fig = px.choropleth(
data_g,
locations="iso_alpha",
color="lifeExp",
color_continuous_scale=px.colors.diverging.BrBG,
color_continuous_midpoint=avg_lifeExp,
title="World Average Life Expectancy in 2007 in years was %.1f" % avg_lifeExp
)
fig.update_layout({'width': 720, 'height': 360})
fig.show()
fig = px.choropleth(
data_g,
locations="iso_alpha",
color="lifeExp",
color_continuous_scale=px.colors.diverging.BrBG,
title="World Average Life Expectancy in 2007 in years was %.1f" % avg_lifeExp
)
fig.update_layout({'width': 720, 'height': 360})
fig.show()
# base
px.bar(
data_frame=dfa,
x='a',
y='b',
width=720,
height=360,
base = dfa['b'] * -1
)
# facet_row
px.bar(
data_frame=df,
x='a',
y='b',
facet_row='c',
width=720,
height=360
)
# facet_col
px.bar(
data_frame=df,
x='a',
y='b',
facet_col='c',
width=720,
height=360
)
# facet_col_spacing
px.bar(
data_frame=df,
x='a',
y='b',
facet_col='c',
facet_col_spacing=0.4,
width=720,
height=360
)
# facet_col_spacing
px.bar(
data_frame=df,
x='a',
y='b',
facet_col='c',
facet_col_spacing=0.2,
width=720,
height=360
)
# facet_col_spacing
# facet_col_wrap
px.bar(
data_frame=df,
x='a',
y='b',
facet_col='c',
facet_col_wrap= 1,
facet_col_spacing=0.2,
width=720,
height=360
)
# facet_col_wrap
px.bar(
data_frame=df,
x='a',
y='b',
facet_col='c',
facet_col_wrap= 3,
facet_col_spacing=0.2,
width=720,
height=360
)
# facet_col_wrap
px.bar(
data_frame=df,
x='a',
y='b',
facet_col='c',
facet_col_wrap= 2,
facet_col_spacing=0.2,
width=720,
height=360
)
# category_orders
px.bar(
data_frame=dfa,
x='a',
y='b',
facet_col='e',
width=720,
height=360,
category_orders={'e': ['Sat', 'Fri', 'Thur']}
)
# pattern_shape
# pattern_shape_sequence
px.bar(
data_frame=df,
x='a',
y='b',
pattern_shape="c",
pattern_shape_sequence=[".", "x",'\\'],
width=720,
height=360
)
# pattern_shape_map
px.bar(
data_frame=df,
x='a',
y='b',
pattern_shape="c",
pattern_shape_map={
'pie': '.',
'apple': 'x',
'orange': '\\'
},
width=720,
height=360
)
tips["error"] = tips["total_bill"] / 100
fig = px.scatter(
tips,
x="total_bill",
y="day",
color="sex",
error_x="error",
error_y="error",
width=720,
height=360
)
fig.show()
tips["e"] = tips["total_bill"] / 100
fig = px.bar(
tips,
x="total_bill",
y="day",
color="sex",
error_x="e",
error_y="e",
width=720,
height=360
)
fig.show()
tips.head()
total_bill | tip | sex | smoker | day | time | size | error | e | |
---|---|---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 | 0.1699 | 0.1699 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 | 0.1034 | 0.1034 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 | 0.2101 | 0.2101 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 | 0.2368 | 0.2368 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 | 0.2459 | 0.2459 |
x_data = ['10 days', '20 days', '30 days']
y_data = [0.5, 0.8, 0.4]
err_y_data = [0.1, 0.2, 0.05]
colors = ['rgba(93, 164, 214, 0.7)', 'rgba(255, 144, 14, 0.7)', 'rgba(44, 160, 101, 0.7)']
fig = go.Figure()
fig.add_trace(go.Scatter(x=x_data, y=y_data,
text=np.round(y_data, 1),
mode='markers+text',
textposition='top center',
marker=dict(color=colors, size=12),
showlegend=False
))
for i, bar in enumerate(err_y_data):
fig.add_trace(go.Scatter(
x=[x_data[i]],
y=[y_data[i]],
mode='markers+text',
textposition='top center',
error_y=dict(
type='data',
color = colors[i],
array=[bar],
visible=True),
marker=dict(color='rgba(0,0,0,0)', size=12),
showlegend=False
))
fig.update_layout({'width': 720, 'height': 360})
fig.show()
X = np.linspace(-1, 1, 100)
Y = np.sinc(X)
x = [-0.89, -0.24, -0.0, 0.41, 0.89, ]
y = [0.36, 0.75, 1.03, 0.65, 0.28, ]
fig = go.Figure()
fig.add_trace(go.Scatter(
x=X, y=Y,
name='test'
))
fig.add_trace(go.Scatter(
x=x, y=y,
mode='markers',
name='measured',
error_y=dict(
type='constant',
value=0.1,
color='green',
thickness=1.5,
width=3,
),
error_x=dict(
type='constant',
value=0.2,
color='blue',
thickness=1.5,
width=3,
),
marker=dict(color='green', size=8)
))
fig.update_layout({'width': 720, 'height': 360})
fig.show()
# animation_frame
# animation_group
df = pd.read_csv('test.csv')
country = 'location'
fig = px.bar(
df.sort_values('date'),
x=country, y='people_vaccinated_per_hundred',
color=country,
animation_frame='date',
animation_group=country,
hover_name=country,
range_y=[0,50],
range_x=[0,30]
)
fig.update_layout(
template='plotly_dark',
margin=dict(r=10, t=25, b=40, l=60)
)
fig.show()
# range_x
px.bar(data_frame=df,
x='a',
y ='b',
hover_name='c',
text='c',
range_x=(2, 5),
width=720,
height=360
)
# range_y
px.bar(data_frame=df,
x='a',
y ='b',
hover_name='c',
text='c',
range_y=(2, 15),
width=720,
height=360
)
# log_y
# log_x
px.bar(
data_frame=dfa,
x='a',
y='b',
text='b',
log_y=True,
width=720,
height=360
)
# text_auto
px.bar(
data_frame=dfa,
x='a',
y='c',
text='c',
width=720,
height=360
)
data = px.data.gapminder()
data_canada = data[data.country == 'Canada']
fig = px.bar(data_canada, y='year', x='pop',
hover_data=['lifeExp'],
color='lifeExp',
labels={'pop':'population of Canada'},
height=600,
width=720,
orientation='h',
title='test'
)
fig.show()
fig = px.bar(data_canada, y='year', x='pop',
hover_data=['lifeExp'],
color='lifeExp',
height=600,
width=720,
orientation='h',
title='test'
)
fig.show()
# text_auto
px.bar(
data_frame=dfa,
x='a',
y='c',
text_auto='.2f',
width=720,
height=360
)
悬浮激活时, 显示相关的信息, 默认状态显示的时x,y的值
custom_data (list of str or int, or Series or array-like) – Either names of columns in data_frame, or pandas Series, or array_like objects Values from these columns are extra data, to be used in widgets or Dash callbacks for example. This data is** not user-visible** but is included in events emitted by the figure (lasso selection etc.)
# default, hover
px.bar(data_frame=df,
x='a',
y ='b',
width=720,
height=360
)
# hover_name
px.bar(data_frame=df,
x='a',
y ='b',
hover_name='c',
width=720,
height=360
)
# hover_data
px.bar(
data_frame=df,
x='a',
y='b',
hover_data=['b', 'c', 'e', 'a'],
width=720,
height=360
)
# custom_data
px.bar(data_frame=df,
x='a',
y ='b',
custom_data='e',
width=720,
height=360
)
# custom_data
gap_mind = px.data.gapminder().query("year == 2007").query("continent == 'Americas'")
fig = go.Figure(go.Pie(
name = "",
values = gap_mind['pop'],
labels = gap_mind['country'],
customdata=gap_mind['iso_num'],
hovertemplate = "Country:%{label}: <br>Population: %{value} </br> iso num:%{customdata}"
))
fig.update_layout({'width': 720, 'height': 360})
fig.show()
# opacity
px.bar(
x = [1,2,3],
y=[10, 12, 5],
opacity=0.5,
title='test',
width=720,
height=360
)
# 查看模板
# 应该也可以自定义模板
pio.templates
Templates configuration ----------------------- Default template: 'plotly' Available templates: ['ggplot2', 'seaborn', 'simple_white', 'plotly', 'plotly_white', 'plotly_dark', 'presentation', 'xgridoff', 'ygridoff', 'gridon', 'none']
# 类似于excel中的模板
px.bar(
x = [1,2,3],
y=[10, 12, 5],
width=720,
height=360,
template='ggplot2'
)
px.bar(
x = [1,2,3],
y=[10, 12, 5],
width=720,
height=360,
template='gridon'
)
go.Bar
更为庞大的参数列, 提供了更为细致的操控
parameter |
---|
arg |
alignmentgroup |
base |
basesrc |
cliponaxis |
constraintext |
customdata |
customdatasrc |
dx |
dy |
error_x |
error_y |
hoverinfo |
hoverinfosrc |
hoverlabel |
hovertemplate |
hovertemplatesrc |
hovertext |
hovertextsrc |
ids |
idssrc |
insidetextanchor |
insidetextfont |
legendgroup |
legendgrouptitle |
legendrank |
legendwidth |
marker |
meta |
metasrc |
name |
offset |
offsetgroup |
offsetsrc |
opacity |
orientation |
outsidetextfont |
selected |
selectedpoints |
showlegend |
stream |
text |
textangle |
textposition |
textpositionsrc |
textsrc |
texttemplate |
uid |
uirevision |
unselected |
visible |
width |
widthsrc |
x |
x0 |
xaxis |
xcalendar |
xhoverformat |
xperiod |
xperiod0 |
xperiodalignment |
xsrc |
y |
y0 |
yaxis |
ycalendar |
yhoverformat |
yperiod |
yperiod0 |
yperiodalignment |
ysrc |
fig = go.Figure(data=[go.Bar(
# 接受的数据不再是直接的pandas
x=[1, 2, 3, 5.5, 10],
y=[10, 8, 6, 4, 2],
# 宽度变成了, 逐个对bar大小调节
width=[0.8, 0.8, 0.8, 3.5, 4],
# text不再是直接显示图(数据)标签, 需要手动
text = [str(e) for e in [10, 8, 6, 4, 2]]
)]).update_layout({'width': 720, 'height': 360})
fig.show()
tmp = pd.DataFrame(
{
"Predicted": np.sort(np.random.uniform(3, 15, 4)),
"real": np.sort(np.random.uniform(3, 15, 4)),
"Category": ["A", "B", "C", "D"],
"new_val": np.random.uniform(3, 15, 4),
}
)
tmp
Predicted | real | Category | new_val | |
---|---|---|---|---|
0 | 4.872227 | 4.443002 | A | 8.476273 |
1 | 8.449721 | 6.388815 | B | 13.714001 |
2 | 8.522264 | 8.235463 | C | 14.482487 |
3 | 12.145617 | 14.430752 | D | 4.933963 |
# 组合图的实现方式 1
fig = px.bar(
tmp, x="Category",
y=["Predicted", "real", "new_val"],
title="test", width=720, height=360
).add_traces(
px.line(tmp,
x="Category",
y="real", text='real').update_traces(
showlegend=True,
name="real").data
).add_traces(
px.line(tmp,
x="Category",
y="Predicted").update_traces(showlegend=True, name="Predicted").data
)
# 打印
# print(fig.data)可以看到各个对象的配置
# 对其中的线条颜色进行调整
fig.data[3].line.color = 'orange'
fig.show()
fig = go.Figure()
for e in ["Predicted", "real", "new_val"]:
fig.add_trace(go.Bar(x=tmp['Category'],
y=tmp[e],
name='bar_' + e))
fig.add_trace(go.Scatter(x=tmp['Category'], y=tmp['real'], name='real', ))
fig.update_layout({"title": 'Post Test', 'barmode': 'relative'})
fig.add_trace(go.Scatter(
x=tmp['Category'],
y=tmp['Predicted'],
name="predicted",
mode='lines+text',
text=[str(e) for e in range(4)]
))
fig.update_layout({'width': 720, 'height': 360})
fig.show()