Python数据可视化实战 pyecharts与Plotly从入门到上手 date: 2026-05-24 category: 数据分析 tags: [Python, 数据可视化, pyecharts, Plotly, 数据分析]Python数据可视化实战pyecharts与Plotly从入门到上手一、pyecharts用Python画出漂亮的ECharts图表pyecharts 是一个基于百度 ECharts 的 Python 可视化库画出来的图表交互性很强还能拼成大屏展示。1.1 导入库from pyecharts.charts import * # 导入所有图表类Page拼页面要用这个星号导入 import pyecharts.options as opts # 导入配置项用来设置坐标轴、标题等 import numpy as np # 导入numpy用来生成数学数据1.2 柱状图——谁多谁少一目了然def bar(): # 准备x轴和y轴的数据 x_data [水笔, 铅笔, 钢笔, 圆珠笔] # x轴笔的种类 y_data [40, 30, 98, 42] # y轴每种笔的销量 # 创建柱状图对象把数据塞进去 bar (Bar() .add_xaxis(x_data) # 添加x轴数据 .add_yaxis(, y_data) # 添加y轴数据第一个参数是图例名称空字符串表示不显示 ) return bar1.3 折线图——看趋势变化def line(): # 准备数据各手机品牌的销量 x_data [Apple, Huawei, Xiaomi, Oppo, Vivo, Meizu] # 品牌名 y_data [123, 153, 89, 107, 98, 23] # 对应销量 # 创建折线图把数据填进去 line (Line() .add_xaxis(x_data) # x轴填品牌 .add_yaxis(呵呵, y_data) # y轴填销量呵呵是这条线的名字 ) return line1.4 散点图——看数据的分布规律def scatter(): # 生成0到2π之间的100个等间距点 x np.linspace(0, 2 * np.pi, 100) y np.sin(x) # 算出每个点对应的正弦值 # 创建散点图 scatter (Scatter() .add_xaxis(list(x)) # x轴0到2π的值 .add_yaxis(正弦, list(y)) # y轴正弦值正弦是图例名 .set_global_opts( # 重要把x轴和y轴都设成数值轴否则散点图会变成类目轴就乱套了 xaxis_optsopts.AxisOpts(type_value), yaxis_optsopts.AxisOpts(type_value) ) ) return scatter1.5 饼图——看各部分占多少比例def pie(): # 各品种狗的数量 num [110, 136, 108, 48, 111, 112, 103] lab [哈士奇, 萨摩耶, 泰迪, 金毛, 牧羊犬, 吉娃娃, 柯基] # 把标签和数字配对变成[(哈士奇,110), (萨摩耶,136), ...]这样的格式 data_pair_ list(zip(lab, num)) # 创建饼图 pie (Pie() .add(饼图, data_pairdata_pair_, # 填入配对好的数据 rosetyperadius, # 南丁格尔玫瑰图扇区半径不一样大数据越大扇区越长 radius[20%, 45%] # 内半径20%外半径45%控制饼图大小 )) return pie1.6 把多个图表拼到一个页面上大屏展示# 创建一个页面对象布局方式选可拖拽 page Page(layoutPage.DraggablePageLayout, page_titletest) # 把上面画的4个图都加到这个页面里 page.add( bar(), # 柱状图 line(), # 折线图 scatter(), # 散点图 pie() # 饼图 ) # 保存成HTML文件浏览器打开就能看到 page.render(.//test.html)1.7 保存拖拽后的布局# 先在浏览器里手动拖拽图表到你想要的位置 # 然后运行这行代码把拖拽后的布局保存成新的HTML文件 # 注意如果用PyCharm需要先把上面的page.render那行注释掉 page.save_resize_html( rtest.html, # 原始HTML文件 cfg_filechart_config.json, # 拖拽后生成的配置文件 destr大屏显示案例成品.html # 最终输出的文件名 )二、Plotly更强大的交互式可视化库Plotly 是一个非常强大的Python可视化库画出来的图表可以交互缩放、悬停查看数据等而且代码简洁。2.1 导入库import plotly.graph_objects as go # 底层API灵活度更高想怎么画就怎么画 import plotly.express as px # 高级API一行代码出图简单粗暴 import warnings warnings.filterwarnings(ignore) # 屏蔽警告信息让输出更干净2.2 折线图——Plotly版# 生成数据0到10之间的100个点 t np.linspace(0, 10, 100) y np.sin(t) # 正弦函数 # 第一步画轨迹就是你要画的那条线的数据 data go.Scatter(xt, yy, modelines) # modelines表示画折线 # 第二步把轨迹放到画布上 fig go.Figure(data) # 第三步调整画布的外观 fig.update_layout( margindict(l30, r30, t30, b30), # 左右上下边距间接控制图的大小 paper_bgcolorpink, # 背景色设为粉色 width800, # 图片宽度800像素 height300 # 图片高度300像素 ) # 第四步展示图形 fig.show()2.3 散点图——把mode换成markers就行# 同样的数据只改mode t np.linspace(0, 10, 100) y np.sin(t) # modemarkers就是画散点只画点不连线 data go.Scatter(xt, yy, modemarkers) fig go.Figure(data) fig.update_layout( margindict(l30, r30, t30, b30), paper_bgcolorpink, width800, height300 ) fig.show()小贴士mode参数决定画什么lines折线markers散点linesmarkers点线组合2.4 同一张图上画多条线# 生成数据 t np.linspace(0, 10, 200) y0 np.sin(t) # 第一条线正弦函数 y1 np.cos(t) ** 2 # 第二条线余弦的平方 # 分别画两条轨迹 trace0 go.Scatter(xt, yy0, modelines) # 第一条线 trace1 go.Scatter(xt, yy1, modelines) # 第二条线 # 把两条轨迹都放到画布上用列表传进去 fig go.Figure([trace0, trace1]) # 设置标题和轴标签 fig.update_layout( title两个函数的轨迹, # 图表标题Plotly自动识别中文 xaxis_titlex轴, # x轴标签 yaxis_titley轴, # y轴标签 height500 ) fig.show()2.5 柱状图# 简单柱状图 names [Byron, 梁, 天使男孩] # x轴人名 data go.Bar(xnames, y[99, 88, 78]) # y轴分数 fig go.Figure(data) fig.show()2.6 对比柱状图并列/堆叠# 并列柱状图多个人、多个科目的成绩对比 names [Byron, 梁, 天使男孩] data1 go.Bar(xnames, y[99, 88, 78], name英语) # 英语成绩 data2 go.Bar(xnames, y[67, 79, 82], name数学) # 数学成绩name是图例标签 fig go.Figure([data1, data2]) # 两个柱状图放一起默认并列显示 fig.show() # 如果想改成堆叠效果加一行 fig.update_layout(barmodestack) # barmodestack就是堆叠group是并列 fig.show()2.7 点线组合图# 既能看到点又能看到线还能自定义点的大小和颜色 trace go.Scatter( x[1, 2, 3], y[1, 2, 3], markerdict( color[red, blue, green], # 每个点不同颜色 size[30, 60, 90] # 每个点不同大小越大的点越醒目 ), modemarkerslines # 同时画点和线 ) go.Figure(trace)三、Plotly Express一行代码出图的快捷方式plotly.express简称px是Plotly的高级封装用更少的代码画同样的图。3.1 散点图——用鸢尾花数据集# 自带的数据集不用自己下载 iris px.data.iris() # 加载鸢尾花数据集 iris.head() # 看看前5行长什么样 # 一行代码画散点图 fig px.scatter( iris, xsepal_length, # x轴花萼长度 ysepal_width, # y轴花萼宽度 colorspecies # 按品种分颜色每个品种一个颜色自动分配 ) fig.show()3.2 饼图——美洲人口占比# 筛选出2007年美洲的数据 df px.data.gapminder().query(year 2007).query(continent Americas) fig px.pie( df, valuespop, # 饼图的大小由人口数决定 namescountry, # 按国家分组 title美洲人口, # 标题 hover_data[lifeExp], # 鼠标悬停时额外显示预期寿命 height500 ) # 把标签写在饼图里面默认在外面 fig.update_traces(textpositioninside, textinfopercentlabel) # 字体太小的就隐藏掉免得挤在一起看不清 fig.update_layout(uniformtext_minsize8, uniformtext_modehide) fig.show()3.3 圆环图甜甜圈图# 筛选亚洲数据 df2 px.data.gapminder().query(continent Asia) fig px.pie( df2, valuespop, hole0.5, # 关键参数在0.5倍半径处挖个洞就变成圆环了 namescountry, height500 ) fig.update_traces(textpositioninside, textinfopercentlabel) fig.update_layout(uniformtext_minsize8, uniformtext_modehide) fig.show()3.4 气泡图——三个维度的数据一次看# 筛选2002年的全球数据 gap px.data.gapminder().query(year 2002) fig px.scatter( gap, xgdpPercap, # x轴人均GDP ylifeExp, # y轴预期寿命 colorcontinent, # 颜色按大洲分 sizepop, # 点的大小由人口数决定人越多点越大 size_max60, # 点的最大尺寸防止太大挡住别的点 height500 ) fig.show()气泡图的妙处一个图同时展示了4个维度的信息——x轴位置、y轴位置、颜色、点大小3.5 旭日图——层级关系一目了然# 小费数据集 df4 px.data.tips() # 旭日图从外到内依次是 day → time → sex就像剥洋葱一样 fig px.sunburst( df4, path[day, time, sex], # 层级路径星期几 → 午餐/晚餐 → 性别 valuestotal_bill, # 每个扇区的大小由账单总额决定 height500 ) fig.show()3.6 小提琴图——看数据的分布形状# 小提琴图能同时看到数据的分布密度和箱线图 # 横轴是午餐/晚餐纵轴是小费金额 px.violin(df4, xtime, ytip, height500)小提琴图是什么可以理解为旋转90度的密度图越胖的地方说明那个值的数据越多。3.7 3D散点图——多一个维度# 鸢尾花数据集 df5 px.data.iris() fig px.scatter_3d( df5, xsepal_length, # x轴 ysepal_width, # y轴 zpetal_width, # z轴多了第三个维度 colorspecies, # 按品种分颜色 height500 ) fig.show() # 可以用鼠标拖拽旋转3D图3.8 动态地图——看全球人口变迁# 加载全球数据 df5 px.data.gapminder() fig px.scatter_geo( df5, locationsiso_alpha, # 国家代码如CHN、USA colorcontinent, # 按大洲分颜色 hover_namecountry, # 鼠标悬停显示国家名 sizepop, # 点的大小代表人口 animation_frameyear, # 按年份做动画点击播放按钮就能看到人口随时间变化 projectionnatural earth, # 地图投影方式 height500 ) fig.show()最酷的功能animation_frameyear会让图表变成动画点击播放按钮你就能看到从1952年到2007年全球各国人口的变化过程四、总结对比特性pyechartsPlotly (go)Plotly Express (px)上手难度中等中等简单代码量较多中等极少交互性强强强大屏展示支持拖拽布局不直接支持不直接支持3D图表支持支持支持动画不直接支持不直接支持支持animation_frame适用场景数据大屏、报表精细控制图表样式快速探索数据