深圳中高端网站建设怎么样,更改网站建设报价,推广渠道怎么写,免费海报背景素材我先说说文章标题中的“够用版”啥意思#xff0c;为什么这么写。
按照我个人观点#xff0c;在使用Python进行数据分析时#xff0c;我们有时候肯定要结合到图表去进行分析#xff0c;去直观展现数据的规律和特定#xff0c;那么我们肯定要做一些简单的可视化#xff0…我先说说文章标题中的“够用版”啥意思为什么这么写。
按照我个人观点在使用Python进行数据分析时我们有时候肯定要结合到图表去进行分析去直观展现数据的规律和特定那么我们肯定要做一些简单的可视化但是呢也不需要太过精美的图简单的图简单到包含基本功能、看得懂就行。假如我们不会用python去绘制一些简单的图我们可能要将数据导入到其他绘图工具比如Excel等然后再绘图这太麻烦了又假如我们很熟悉Python的各种专门绘图的库也会用Python做很精美的图表那当然最好不过效率自然没有专业的绘图工具比如Power BI、Tableau、Excel等高因为python写代码很费时间和精力专业的绘图软件往往是拖拽式的不用写代码巨方便。我写这篇文章呢就是保证我们能够用python做简单的可视化图表但是不会很深入学习都是常见的图表所以说我才说“够用”哈。当然了个人观点谨慎采纳。
还有就是本文只讲matplotlib库不讲别的绘图相关的库因为matplotlib太实用了。 目录
一、基本概念
1、matplotlib图表元素组成
2、层级结构
3、图表主要元素调整函数说明
4、常见二维图表的绘制函数
5、函数常用参数取值说明
二、常见图表绘制演示
一折线图
1.1 单个折线图
1.2 多个折线在同一张图且同一纵轴
1.3 “双纵坐标”折线图
1.4 带数据标记的折线图 二在一个图形figure中绘制多张子图 三散点图
3.1 简单的散点图
3.2 带数据标记的散点图
四柱状图竖直型
4.1 带数据标记的柱状图
4.2 并列柱状图带数据标记
4.3 堆积柱状图
五饼图
六统计直方图
七箱线图 一、基本概念
1、matplotlib图表元素组成
图形figure、坐标图形axes、图名或标题title、图例legend、主要刻度major tick、次要刻度minor tick、主要刻度标签major tick labe l、次要刻度标签minor tick label、Y轴名Y axis label、X轴名X axis label、边框图line、数据标记markers、网格grid线等。
下图以及部分文本内容取自于《Python数据可视化之美专业图表绘制指南》。 matplotlib主要包含两类元素
基础类线line)、点maker、文字text、图例legend、标题title等容器类图形figure、坐标图形axes、坐标轴axis、刻度tick
2、层级结构
图形 figure→坐标图形axes→坐标轴axis→刻度tick
figure对象整个图形即是一个figure对象也是一个容器。figure对象至少包含一个子图也就是axis对象。它还包含一些特殊对象比如图名title等。axes对象字面上理解axes是axis坐标轴的复数但它并不是指坐标轴而是子图对象。可以这样理解每一个子图都有X轴和Y轴axes则用于代表这两个坐标轴所对应的一个子图对象。比如axes[0,0]表示第一个子图而不是坐标轴axes[0,1]表示第二个子图。axis对象axis是数据轴对象是比figure低一级的容器,主要用于控制数据轴上的刻度位置和显示数值。axis有locator和formatter两个子对象分别用于 控制刻度位置和显示数值。tick对象常见的二维直角坐标系axes都有两条坐标轴 axis横轴X axis和纵轴Y axis。每个坐标轴都包含两 个元素刻度容器类元素该对象里还包含刻度本身和刻度标 签标签基础类元素该对象包含的是坐标轴标签。
3、图表主要元素调整函数说明
函数核心参数说明功能subplotsnrows(子图的行数), ncols子图的列数, figsize(图表大小), dpi分辨率、sharex、sharey子图之间是否共享坐标轴布尔类型用于创建一个或多个子图通过设置nrows、ncols实现返回值为Figure对象用于控制整个图形和包含多个子图的Axes对象对象用于控制每个子图figurefigsize(图表大小)、dpi分辨率、facecolor(背景色)、edgecolor设置图表大小、分辨率title str图名、fontsize、color 设置标题 xlabel ylabel xlabelx轴名称、ylabely轴名称、rotation设置标签显示方向取值为0或1 设置x、y坐标轴名称 axis xlim ylim xmin、xmax 或 ymin、ymax设置x、y轴的范围 xticks yticks ticks(刻度数值)、labels刻度名称、fontdict设置x、y轴的刻度大小grid b有无网格线、which主/次网格线、axisx、y轴网格线取值主要有‘x’、‘y’、‘both’、color、linestyle、linewidth、alpha透明度 设置x、y轴的主/次网格线legendloc大致位置比如左上角、bbox_to_anchor图例的锚点具体坐标位置控制图例显示
4、常见二维图表的绘制函数
函数主要参数说明图表类型plotx、y、color、linewidth、marker标记类型、markersize标记大小、label线条标签、markerfacecolor(标记填充色)折线图、带标记的折线图scatter()x、y、s散点图大小、color、marker散点类型、markerfacecolor标记填充色散点图、气泡图bar x、y、width、align柱形位置、color、edgecolor柱子边框颜色 柱状图、堆积柱状图piex、colors(要求颜色列表)、labels标签、autopct百分比文本的格式、labeldistance控制标签的位置默认值为1.1、pctdistance控制百分比标签距离饼图中心的距离默认值0.6、radius控制饼图的半径饼图histx、bins箱数、range设定直方图的x轴的最小值和最大值、density是否为频率统计、align柱形位置、label标签、color、edgecolor统计直方图boxplotx、notch有无凹槽、sym散点类型、vert水平或竖直方向布尔型、widths、labels标签、patch_artist是否填充箱体颜色箱型图textx、y、s设置标记值字符串、ha水平对齐、va垂直对齐、fontsize给图形生成数据标记
5、函数常用参数取值说明
部分的参数的取值说明
参数作用取值类型取值figsize设置图形大小二维数值元组型形如11、11等dip设置图形分辨率数值型fontsize设置字体大小数值型linestyle设置线网格线、折线等的类型字符串实线 - 、虚线 -- 、点线 : 、点划线 -. marker设置数据点的标记样式字符串圆点o、方块ssquare、上三角^、菱形D, diamond、星状*等alpha设置透明度浮点型取值范围为 0完全透明到 1完全不透明xlim、ylim设置 X 、Y 轴范围数值型元组形如 (0, 10)、(-5, 5) 等xticks、yticks标记 X 、Y 轴刻度位置数值型列表形如 [0, 2, 4, 6, 8]loc设置图例位置字符串upper right、lower left、best 等bbox_to_anchor设置图例的锚点位置数值型元组形如 (1.05, 1)align控制条形图或箱线图的对齐方式字符串center默认居中对齐、edge沿边缘对齐、None并排放置vert是否将箱线图垂直摆放布尔值True默认垂直摆放、False水平摆放sym指定箱线图中异常点的形状字符串默认为 加号也可以是其他标记符号如 o、*、r^ 等va控制文本的垂直对齐方式字符串center默认居中对齐、top顶部对齐、bottom底部对齐、baseline基线对齐ha控制文本的水平对齐方式字符串center默认居中对齐、left左对齐、right右对齐rotation设置标签显示方向竖直或水平数值型取值为0或1autopct自动计算饼图每个扇形的百分比要设置显示格式字符串 只显示一位小数百分比%1.1f%%
二、常见图表绘制演示
进行可视化前除了导入必要的库以外还需要设置中文字体避免图形中显示中文字体时出现乱码的情况。
import pandas as pd
import matplotlib.pyplot as plt# 设置字体避免图形中显示中文字体时出现乱码
plt.rcParams[font.sans-serif] [Microsoft YaHei]# 创建示例数据
data {Category: [A, B, C, D, E],Value1: [10, 20, 35, 50, 100],Value2: [5, 15, 18, 35, 45],Value3: [12, 22, 17, 27, 32],index1: [2, 4, 6, 8, 10]
}
df pd.DataFrame(data)
注后面所有代码都包含上述代码。
一折线图
1.1 单个折线图
需要注意的是plt.plot()并不接受x和y作为关键字参数只接受位置参数因此“xdf[index1], ydf[Value1]”这样写会报错。
# 折线图
plt.plot(df[index1], df[Value1], linestyle-, labelv1) # 注意要使用位置参数传入x、yplt.title(示例1)
plt.legend() # 显示图例‘v1’
plt.show() 如果需要调横坐标或纵坐标的刻度范围可以使用plt.xlim([xmin, xmax])、plt.ylim([ymin, ymax])或plt.axis([xmin, xmax, ymin, ymax])其中plt.axis()可以一次性修改x、y坐标的刻度范围演示如下
# 折线图
plt.plot(df[index1], df[Value1], labelv1) # y轴坐标刻度范围改为[0, 200]
plt.ylim([0,200])plt.title(示例1)
plt.legend(locupper left) # 显示图例‘v1’
plt.show() 如果需要在y轴刻度上显示出75、180、200的点位并将该点标记为A、B、200这三个刻度标签则可以使用plt.yticks()方法。注意的是其中的ticks参数的数值只能是y坐标轴的刻度范围内的值比如示例的y坐标刻度范围是0~200则ticks参数里的值不能大于200演示如下
# 折线图
plt.plot(df[index1], df[Value1], labelv1) # y轴坐标刻度范围改为[0, 200]
plt.ylim([0,200])
# 显示y坐标轴的特定点位
plt.yticks(ticks[77, 100, 200], labels[A, B,200])plt.title(示例1)
plt.legend(locupper left) # 显示图例‘v1’
plt.show() 1.2 多个折线在同一张图且同一纵轴
plt.plot(df[index1], df[Value1], labelv1) # 绘制 Value1 对应的折线
plt.plot(df[index1], df[Value2], labelv2) # 绘制 Value2 对应的折线plt.title(示例2)
plt.legend(locbest) # 显示图例v1和v2
plt.show() 1.3 “双纵坐标”折线图
有时候两条折线的的纵坐标尺度相差太大导致另一条在该统一的y轴刻度范围变化幅度不大甚至显示成了一条直线。可以使用“双纵坐标轴”绘制演示如下
# 创建一个含1*1张子图的图形。看不懂这行代码可以先忽略后面会讲到。
fig, ax1 plt.subplots(1, 1, figsize(8,5)) # 设置图形窗口即容器的大小为5*8ax1.plot(df[index1], df[Value1], labelv1) # 绘制 Value1 对应的折线# 创建ax1子图第二个纵坐标轴 ax2
ax2 ax1.twinx()
ax2.plot(df[index1], df[Value2], labelv2, colorred) # 绘制 Value2 对应的折线ax1.set_title(示例2)
ax1.legend(locupper left) # 显示图例v1
ax2.legend(locupper left, bbox_to_anchor(0,0.9)) # 显示图例v2,并设置具体位置避免与v1位置重叠而只显示一个图例
plt.show() 1.4 带数据标记的折线图
演示如下
# 绘制添加标记线
plt.plot(df[index1], df[Value1], linestyle-, marker*, labelv1, markersize10)
# 绘制不带标记的线
plt.plot(df[index1], df[Value2], linestyle--, markerNone, labelv2)# 添加数据值标记
for i in range(len(df)):plt.text(df[index1][i], df[Value1][i], sstr(df[Value1][i]), hacenter, vabottom, fontsize12) # 显示数据值plt.title(带数据标记的折线图)
plt.legend() # 显示图例‘v1’
plt.grid(True, axisboth, alpha0.3) #显示网格线
plt.show() 二在一个图形figure中绘制多张子图
图形figure作为一个容器包含大标题和子图至少一张等元素而其子图又含有子图自己的元素如子图的标题子图的横纵坐标子图的图例等。下面演示如何在一个图形figure中绘制多张子图来理解这些概念。
# 创建一个含2*2张子图的图形fig。其每张子图对象用ax1[0,0],ax1[0,1]...表示。若只有一张图可以直接用ax1表示子图。
fig, ax1 plt.subplots(2, 2, figsize(10,9)) # 设置图形即容器的大小为9*10# 设置图形分辨率、可忽略
fig.dpi 100# 绘制子图1柱状图
ax1[0,0].bar(df[index1], df[Value1], labelv1)
ax1[0,0].set_title(图1, colorred)
ax1[0,0].legend()
ax1[0,0].set_xlabel(index1)
ax1[0,0].set_ylabel(Value1)# 绘制子图4折线图
ax1[1,1].plot(df[index1], df[Value1], labelv1)
ax1[1,1].plot(df[index1], df[Value2], labelv2)
ax1[1,1].set_title(图4, colorred)
ax1[1,1].legend()
ax1[1,1].set_xlabel(index1)
ax1[1,1].set_ylabel(y 值)# 图2、图3我就不绘制了。图1、图4做了演示。fig.suptitle(总标题, colorgreen, fontsize20) # 设置总标题
fig.tight_layout() # 自动调整子图的布局使得元素之间不会重叠
plt.show() 三散点图
3.1 简单的散点图
plt.scatter(df[index1], df[Value1], colorgreen, labelv1)
plt.scatter(df[index1], df[Value2], colorred, labelv2)plt.title(散点图, colorblue)
plt.xlabel(index1)
plt.ylabel(value)
plt.legend() # 显示图例
plt.show() 3.2 带数据标记的散点图
plt.scatter(df[index1], df[Value1], colorgreen, labelv1, marker^)
plt.scatter(df[index1], df[Value2], colorred, labelv2)# 使用text()添加给‘Value1’标记数值
for i in range(len(df)):plt.text(df[index1][i], df[Value1][i], sstr(df[Value1][i]), hacenter, vabottom)# 使用text()添加给‘Value2’标记数值
for i in range(len(df)):plt.text(df[index1][i], df[Value2][i], sstr(df[Value2][i]), hacenter, vabottom)plt.title(带数据标记的散点图, colorblue)
plt.xlabel(index1)
plt.ylabel(value, rotation1)
plt.legend() # 显示图例
plt.show() 四柱状图竖直型
水平柱状图就不做演示了因为我觉得平时用python进行数据分析时用竖直型就够了避免与竖直型的代码搞混淆真要用到水平柱状图可以用其他工具比如Excel或其他专业绘图工具。
4.1 带数据标记的柱状图
plt.bar(df[Category], df[Value1], width0.5, labelv1, colorred)plt.title(简单的柱状图)
plt.xlabel(类别, fontsize9)
plt.ylabel(value, fontsize9, rotation1)
plt.legend(locupper left)
plt.show() 4.2 并列柱状图带数据标记
也叫分组柱状图。在同一个坐标系中绘制多组数据时可以通过多次调用 plt.bar() 并调整每组柱状图的位置以避免它们重叠。通常我们会通过偏移每组柱子的位置来实现并排显示。
关键步骤 计算柱子的位置难点每组类别的 x 轴坐标需要调整使得三根柱子能够并排显示。 设置柱子的宽度确保柱子不会重叠并留有适当间距。 绘制多个柱状图使用 plt.bar() 分别绘制每一组柱子并调整它们的 x 轴位置。
两组数据示例带数据标记
import numpy as np# 定义柱子的宽度
width0.4# 获取规律的x坐标用于设置柱子的位置
x np.arange(len(df)) # 输出[0, 1, 2, 3, 4]# 绘制两组柱状图
bar1 plt.bar(x-width/2, df[Value1], widthwidth, labelv1类, colororange, edgecolorblack) # 左移width/2。其中x-width/2为每根柱子底部中心点的横坐标
bar2 plt.bar(xwidth/2, df[Value2], widthwidth, labelv2类, colorskyblue, edgecolorblack) # 右移width/2。其中xwidth/2为每根柱子底部中心点的横坐标# 这里有点特别bar.get_x()获取的是每根柱子底部左下角的横坐标而不是中心点了。
# 给bar1添加数据标记
for bar in bar1:plt.text(bar.get_x()bar.get_width()/2, bar.get_height(), sstr(bar.get_height()), hacenter, vabottom)# 给bar2添加数据标记
for bar in bar2:plt.text(bar.get_x()bar.get_width()/2, bar.get_height(), sstr(bar.get_height()), hacenter, vabottom)# 将中心坐标标签由[0, 1, 2, 3, 4]更改为[A, B, C, D, E]
plt.xticks(ticksx, labelsdf[Category])plt.grid(axisy, linestyle--, alpha0.5) # 显示网格线
plt.title(两组柱状图带数据标记, fontsize13)
plt.ylabel(value值, rotation1)
plt.xlabel(类别)
plt.legend(locupper left)
plt.show() 三组数据带数据标记难点也是在于计算柱子的坐标示例
import numpy as npplt.figure(figsize(10, 5))
x np.arange(len(df))
width 0.25bar1 plt.bar(x-width, df[Value1], widthwidth, labelv1, colorskyblue, edgecolorblack) # 左移width
bar2 plt.bar(x, df[Value2], widthwidth, labelv2, colorred, edgecolorblack) # 不偏移
bar3 plt.bar(xwidth, df[Value3], widthwidth, labelv3, colororange, edgecolorblack) # 右移widthfor bar in bar1:plt.text(bar.get_x()width/2, bar.get_height(), sstr(bar.get_height()), vabottom, hacenter)for bar in bar2:plt.text(bar.get_x()width/2, bar.get_height(), sstr(bar.get_height()), vabottom, hacenter)for bar in bar3:plt.text(bar.get_x()width/2, bar.get_height(), sstr(bar.get_height()), vabottom, hacenter)# 将中心坐标标签由[0, 1, 2, 3, 4]更改为[A, B, C, D, E]
plt.xticks(ticksx, labelsdf[Category])plt.grid(axisy, linestyle--, alpha0.5) # 显示网格线
plt.title(三组柱状图带数据标记, fontsize13)
plt.ylabel(value值, rotation1)
plt.xlabel(类别)
plt.legend(locupper left)
plt.show() 4.3 堆积柱状图
堆积直方图的优点
适用于比较多个类别在相同区间内的数量或频率。通过堆叠显示每个类别的贡献可以更直观地了解各类别在总数中的占比。
演示如下
import numpy as npx np.arange(len(df[Category])) # x轴位置# 绘制第一类数据
plt.bar(x, df[Value1], width0.4, labelCategory 1, colorb)# 绘制第二类数据堆积在第一类数据上bottom参数表示当前柱子数据堆叠的起始位置默认为0即高度为0的位置开始绘制
plt.bar(x, df[Value2], width0.4, bottomdf[Value1], labelCategory 2, colorg)# 绘制第三类数据堆积在前两类数据上
plt.bar(x, df[Value3], width0.4, bottomdf[Value1] df[Value2], labelCategory 3, colorr)plt.xlabel(类别)
plt.ylabel(Value)
plt.title(堆积柱状图示例)
plt.xticks(x, labelsdf[Category]) # 设置x轴标签
plt.legend()
plt.show() 五饼图
演示如下
# pie()会自动计算df[Value1]的占比不用手动计算
plt.pie(df[Value1], labelsdf[Category], autopct%0.2f%%, labeldistance1.05)plt.title(饼图)
plt.show() 六统计直方图
统计直方图主要有两种频率分布直方图、概率密度直方图。
两者的区别如下
特性频率直方图概率密度直方图定义显示每个区间内数据的频数数据点的数量显示每个区间内数据的相对概率密度每个柱子的总面积为 1总面积总面积所有柱子的高度总和等于数据点的总数总面积等于 1归一化后计算方式频数 / 区间宽度没有归一化(频数 / 总数据量) / 区间宽度即归一化用途适合展示数据集的实际分布和频数情况适合展示数据的概率分布便于进行统计分析和比较不同数据集的分布典型应用展示单一数据集的实际频数分布用于概率密度估计、正态分布拟合等需要考虑数据相对概率分布的情况
频率直方图
import numpy as np# 生成示例数据1000个正态分布的数据
data np.random.randn(1000)# 绘制直方图
plt.hist(data, bins50, colorred, edgecolorblack, alpha0.7, label数据分布)plt.title(频率直方图示例)
plt.xlabel(数据值)
plt.ylabel(频数)plt.legend()
plt.show() 概率密度直方图只要设置参数 densityTrue即可
# 绘制归一化概率密度直方图
plt.hist(data, bins30, colorskyblue, edgecolorblack, alpha0.7, densityTrue, label概率密度)# 添加标题和标签
plt.title(归一化概率密度直方图示例)
plt.xlabel(数据值)
plt.ylabel(频数)plt.legend()
plt.show() 七箱线图
import matplotlib.pyplot as plt
import numpy as np# 生成示例数据1000个正态分布的数据
data np.random.randn(1000)plt.boxplot(data, patch_artistTrue)plt.title(箱型图示例)
plt.ylabel(数据值)
plt.show() # 文章如有错误欢迎大家指正我们下期文章见。