作者介绍 plotly是一个基于plotly.js构建的可视化工具库,支持2D、3D图形,交互流畅。相较于matplotlib这种基础绘图组件,plotly的可视化展现效果更好,可以媲美Tableau的高质量图。 11 plotly的名词解释 12 plotly的绘图步骤 step 1:准备数据 plotly官方文档:https://plot.ly/python/ 同matplotlib一样,plotly的一个画布对象也可以包含多个子图。 31 数据分布 32 数据比较 33 数据关系 34 数据成分plotly
布局(layout):规定了一些需要辅助绘制的内容,如标题、图例等。
数据(data):一个踪迹的列表,因为可能会同时绘制多个图形,如多条折线。
画布(figure):与matplotlib中的画布类似,需要传入data和layout参数
step 2:创建一个或多个踪迹(traces)
step 3:同层踪迹合并
step 4:创建布局(layout)
step 5:在画布(figure)上组合graph部分和layout部分
step 6:图像显示/保存import plotly as pyimport plotly.graph_objs as goimport numpy as npif __name__ == '__main__': # 准备数据 x = [i for i in range(60)] y_shanghai = [np.random.uniform(15, 18) for i in x] y_beijing = [np.random.uniform(12, 17) for i in x] # 创建踪迹 trace1 = go.Scatter( x=x, y=y_shanghai, mode='markers', name='shanghai' ) trace2 = go.Scatter( x=x, y=y_beijing, mode='markers', name='beijing' ) # 同层踪迹拼合 data = [trace1, trace2] # 创建布局 layout = go.Layout(title='示例') # 在画布(figure)上按照布局绘制踪迹 fig = go.Figure(data=data, layout=layout) # 显示 py.offline.plot(fig, filename='first_offline_start.html', auto_open=True)多子图绘制功能
import plotly as pyimport plotly.graph_objs as gotrace1 = go.Scatter( x=[1, 2, 3], y=[4, 5, 6])trace2 = go.Scatter( x=[20, 30, 40], y=[50, 60, 70], xaxis='x2', yaxis='y2')trace3 = go.Scatter( x=[300, 400, 500], y=[600, 700, 800], xaxis='x3', yaxis='y3')trace4 = go.Scatter( x=[4000, 5000, 6000], y=[7000, 8000, 9000], xaxis='x4', yaxis='y4')data = [trace1, trace2, trace3, trace4]layout = go.Layout( xaxis=dict( domain=[0, 0.45] ), yaxis=dict( domain=[0, 0.45] ), xaxis2=dict( domain=[0.55, 1] ), xaxis3=dict( domain=[0, 0.45], anchor='y3' ), xaxis4=dict( domain=[0.55, 1], anchor='y4' ), yaxis2=dict( domain=[0, 0.45], anchor='x2' ), yaxis3=dict( domain=[0.55, 1] ), yaxis4=dict( domain=[0.55, 1], anchor='x4' ))fig = go.Figure(data=data, layout=layout) filename='multiple-subplots.html', auto_open=True)绘制二维图表
import plotly as pyimport plotly.graph_objs as goimport plotly.figure_factory as ffimport numpy as npx = [np.random.randint(1, 100) for i in range(100)] # 每个数字必须是整数trace = go.Histogram( x=x)data = [trace]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) py.offline.plot(fig, filename='test.html', auto_open=True)
2)箱型图import plotly as pyimport plotly.graph_objs as goimport plotly.figure_factory as ffimport numpy as npy1 = np.random.randn(50)-1y2 = np.random.randn(50)+1 trace1 = go.Box( y=y1)trace2 = go.Box( y=y2)data = [trace1, trace2]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) py.offline.plot(fig, filename='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as goimport plotly.figure_factory as ffimport numpy as npy1 = np.random.randn(50)-1y2 = np.random.randn(50)+1 trace1 = go.Violin( y=y1)trace2 = go.Violin( y=y2)data = [trace1, trace2]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) py.offline.plot(fig, filename='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as goimport numpy as nptrace1 = go.Bar( x = ['Jan','Feb','Mar','Apr', 'May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'], y = [20,14,25,16,18,22,19,15,12,16,14,17], name = 'Primary Product', marker=dict( color = 'rgb(49,130,189)' ))trace2 = go.Bar( x = ['Jan','Feb','Mar','Apr', 'May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'], y = [19,14,22,14,16,19,15,14,10,12,12,16], name = 'Secondary Product', marker=dict( color = 'rgb(204,204,204)' ))data = [trace1, trace2]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) py.offline.plot(fig, filename='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as gocategories = ['processing cost','mechanical properties','chemical stability', 'thermal stability', 'device integration']trace1 = go.Scatterpolar( r=[1, 5, 2, 2, 3], theta=categories, fill='toself', name='Product A')trace2 = go.Scatterpolar( r=[4, 3, 2.5, 1, 2], theta=categories, fill='toself', name='Product B')data = [trace1, trace2]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout)py.offline.plot(fig, filename='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as goimport numpy as npx = [i for i in range(100)]y1 = np.random.randn(100)y2 = np.random.randn(100)trace1 = go.Scatter( x=x, y=y1, mode='lines', name='line1')trace2 = go.Scatter( x=x, y=y2, mode='lines', name='line2')data = [trace1, trace2]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) ='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as goimport numpy as nprandom_x = np.random.randn(1000)random_y = np.random.randn(1000)trace = go.Scatter( x=random_x, y=random_y, mode='markers')data = [trace]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) py.offline.plot(fig, filename='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as goimport numpy as nprandom_x = np.random.randn(1000)random_y = np.random.randn(1000)trace = go.Scatter( x=random_x, y=random_y, mode='markers', marker=dict( size=16, color=np.random.randn(500), colorscale='Viridis', showscale=True ))data = [trace]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) ='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as goimport plotly.figure_factory as ffimport numpy as nplabels = ['产品1','产品2','产品3','产品4','产品5']values = [38.7,15.33,19.9,8.6,17.47]trace = go.Pie( labels=labels, values=values, hole=0.3, # 空白区域比例 hoverinfo="label + percent")data = [trace]layout = go.Layout(title='示例')fig = go.Figure(data=data, layout=layout) py.offline.plot(fig, filename='test.html', auto_open=True)import plotly as pyimport plotly.graph_objs as goimport plotly.figure_factory as ffimport numpy as nptrace1 = go.Bar( y = ['CU.SHF', 'AG.SHF', 'AU.SHF'], x = [21258, 30279, 8056], name = '期货1', orientation = 'h', marker = dict( color = '#104E8B', line = dict( color = '#104E8B', width = 3) ))trace2 = go.Bar( y = ['CU.SHF', 'AG.SHF', 'AU.SHF'], x = [19853, 9375, 4063], name = '期货2', orientation = 'h', marker = dict( color = '#1874CD', line = dict( color = '#104E8B', width = 3) ))trace3 = go.Bar( y = ['CU.SHF', 'AG.SHF', 'AU.SHF'], x = [4959, 13018, 8731], name = '期货3', orientation = 'h', marker = dict( color = '#1C86EE', line = dict( color = '#104E8B', width = 3) ))data = [trace1, trace2, trace3]layout = go.Layout( title='稀有金属期货持仓量对比图', barmode='stack')fig = go.Figure(data=data, layout=layout) ='test.html', auto_open=True)数据成分
使用plotly绘制三维图表的方法和绘制二维图表类似,也不需要引入额外模块。
1)三维空间中的点
import numpy as npimport plotly as pyimport plotly.graph_objs as goy1, z1 = np.random.multivariate_normal(np.array([0,0,0]), np.eye(3), 200).transpose()trace1 = go.Scatter3d(x=x1,y=y1,z=z1,mode='markers',marker=dict(color='rgb(217, 217, 217)',size=12,symbol='circle',opacity=0.8))y2, z2 = np.random.multivariate_normal(np.array([0,0,0]), np.eye(3), 200).transpose()trace2 = go.Scatter3d(x=x2,y=y2,z=z2,mode='markers',marker=dict(color='rgb(127, 127, 127)',size=12,symbol='circle',opacity=0.8))data = [trace1, trace2]layout = go.Layout(title='三维散点',autosize=True,margin=dict(l=65,r=50,b=65,t=90))fig = go.Figure(data=data, layout=layout)filename='test.html', auto_open=True)
2)三维空间中的线
import numpy as npimport plotly as pyimport plotly.graph_objs as godef f(x, y):z = np.power(x, 2) + np.power(y, 2)return zx = y = np.linspace(start=0, stop=10, num=1000)z = f(x, y)trace = go.Scatter3d(x=x,y=y,z=z,mode='lines')data = [trace]layout = go.Layout(title='三维线',autosize=True,margin=dict(l=65,r=50,b=65,t=90))fig = go.Figure(data=data, layout=layout)filename='test.html', auto_open=True)fig.show()
3)三维空间中的面
import numpy as npimport plotly as pyimport plotly.graph_objs as godef f(x, y):z = np.power(x, 2) + np.power(y, 2)return za = np.linspace(start=0, stop=3, num=4, dtype=np.int32)b = np.linspace(start=0, stop=3, num=4, dtype=np.int32)y = np.meshgrid(a, b)z = f(x, y)trace = go.Surface(x=x, y=y, z=z)data = [trace]layout = go.Layout(title='三维曲面',autosize=True,margin=dict(l=65,r=50,b=65,t=90))fig = go.Figure(data=data, layout=layout)='test.html', auto_open=True)
高级封装
Plotly Express是Plotly的高级封装,它为复杂的图表绘制提供了一种简单的语法。
51
数据分布
1)直方图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as gotips = px.data.tips()fig = px.histogram(tips, x="total_bill", y="tip", color="sex",marginal="rug", hover_data=tips.columns)py.offline.plot(fig, filename='test.html', auto_open=True)
2)箱形图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as gotips = px.data.tips()fig = px.box(tips, x="day", y="total_bill", color="smoker", notched=True)py.offline.plot(fig, filename='test.html', auto_open=True)
3)小提琴图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as gotips = px.data.tips()fig = px.violin(tips, y="tip", x="smoker", color="sex",box=True, points="all", hover_data=tips.columns)py.offline.plot(fig, filename='test.html', auto_open=True)
52
数据比较
1)柱形图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as gotips = px.data.tips()fig = px.bar(tips, x="sex", y="total_bill", color="smoker", barmode="group")py.offline.plot(fig, filename='test.html', auto_open=True)
2)分组柱形图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as gotips = px.data.tips()fig = px.bar(tips, x="sex", y="total_bill", color="smoker",barmode="group", facet_row="time", facet_col="day",category_orders={"day": ["Thur", "Fri", "Sat", "Sun"], "time": ["Lunch", "Dinner"]})py.offline.plot(fig, filename='test.html', auto_open=True)
3)雷达图
import pandas as pdimport plotly as pyimport plotly.express as pximport plotly.graph_objs as godf = pd.DataFrame(dict(r=[1, 5, 2, 2, 3],theta=['processing cost','mechanical properties','chemical stability', 'thermal stability', 'device integration']))fig = px.line_polar(df, r='r', theta='theta', line_close=True)# fig.update_traces(fill='toself')py.offline.plot(fig, filename='test.html', auto_open=True)
4)折线图
import plotly as pyimport plotly.express as pximport plotly.graph_objs as gogapminder = px.data.gapminder()# 选取2个国家:中国、阿富汗country_list = ["China", "Afghanistan"]tem_gapminder = gapminder.query("country == @country_list")fig = px.line(tem_gapminder, x="year", y="lifeExp", color="country",line_shape="spline", line_dash="country", title="国家人均寿命")# 修改时添加的代码fig.update_traces(dict(mode="markers+lines"))fig.update(layout=dict(xaxis=dict(title="年份", showline=True, nticks=10), yaxis=dict(title="人均寿命", showline=True, nticks=10)))py.offline.plot(fig, filename='test.html', auto_open=True)
53
数据关系
1)带边缘的散点图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as goiris = px.data.iris()fig = px.scatter(iris, x="sepal_width", y="sepal_length", color="species",marginal_y="violin", marginal_x="box",trendline="ols")py.offline.plot(fig, filename='test.html', auto_open=True)
2)矩阵散点图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as goiris = px.data.iris()fig = px.scatter_matrix(iris, dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"], color="species")py.offline.plot(fig, filename='test.html', auto_open=True)
3)带时间轴的散点图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as gogapminder = px.data.gapminder()fig = px.scatter(gapminder, x="gdpPercap", y="lifeExp", animation_frame="year",animation_group="country", size="pop", color="continent",hover_name="country", facet_col="continent",log_x=True,size_max=45, range_x=[100,100000], range_y=[25,90])py.offline.plot(fig, filename='test.html', auto_open=True)
4)三元散点图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as goelection = px.data.election()fig = px.scatter_ternary(election, a="Joly", b="Coderre", c="Bergeron", color="winner",size="total", hover_name="district", size_max=15,color_discrete_map = {"Joly": "blue", "Bergeron": "green", "Coderre":"red"})py.offline.plot(fig, filename='test.html', auto_open=True)
5)平行坐标图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as goiris = px.data.iris()fig = px.parallel_coordinates(iris, color="species_id",labels={"species_id": "Species", "sepal_width": "Sepal Width", "sepal_length": "Sepal Length", "petal_width": "Petal Width", "petal_length": "Petal Length"},color_continuous_scale=px.colors.diverging.Tealrose, color_continuous_midpoint=2)py.offline.plot(fig, filename='test.html', auto_open=True)
6)并行类别图
import numpy as npimport plotly as pyimport plotly.express as pximport plotly.graph_objs as gotips = px.data.tips()fig = px.parallel_categories(tips, color="size", color_continuous_scale=px.colors.sequential.Inferno)py.offline.plot(fig, filename='test.html', auto_open=True)
54
极坐标
1)极坐标散点图
import plotly as pyimport plotly.express as pximport plotly.graph_objs as gowind = px.data.wind()fig = px.scatter_polar(wind, r="frequency", theta="direction")py.offline.plot(fig, filename='test.html', auto_open=True)
2)极坐标条形图
import plotly as pyimport plotly.express as pximport plotly.graph_objs as gowind = px.data.wind()fig = px.scatter_polar(wind, r="frequency", theta="direction")py.offline.plot(fig, filename='test.html', auto_open=True)
55
地理
1)地理坐标散点图
import plotly as pyimport plotly.express as pximport plotly.graph_objs as gogapminder = px.data.gapminder()fig = px.scatter_geo(gapminder, locations="iso_alpha", color="continent", hover_name="country",size="pop", animation_frame="year", projection="natural earth")py.offline.plot(fig, filename='test.html', auto_open=True)
2)地理区域图
import plotly as pyimport plotly.express as pximport plotly.graph_objs as gogapminder = px.data.gapminder()fig = px.choropleth(gapminder, locations="iso_alpha", color="lifeExp", hover_name="country",animation_frame="year",color_continuous_scale=px.colors.sequential.Plasma, range_color=[20,80])py.offline.plot(fig, filename='test.html', auto_open=True)
56
箭头图
1)基本的箭头图
import plotly.figure_factory as ffimport numpy as npx,y = np.meshgrid(np.arange(0, 2, .2), np.arange(0, 2, .2))u = np.cos(x)*yv = np.sin(x)*yfig = ff.create_quiver(x, y, u, v)py.offline.plot(fig, filename='test.html', auto_open=True)
2)带中心点的箭头图
import plotly as pyimport plotly.figure_factory as ffimport plotly.graph_objects as goimport numpy as npx, y = np.meshgrid(np.arange(-2, 2, .2), np.arange(-2, 2, .25))z = x*np.exp(-x**2 - y**2)v, u = np.gradient(z, .2, .2)# 创建箭头图fig = ff.create_quiver(x, y, u, v,scale=.25, arrow_scale=.4, name='quiver', line_width=1)# 往图中添加点fig.add_trace(go.Scatter(x=[-.7, .75], y=[0,0], mode='markers', marker_size=12, name='points'))py.offline.plot(fig, filename='test.html', auto_open=True)

发表评论 取消回复