数据可视化是指将数据以图表的形式表示,并利用数据分析和开发工具发现其中未知信息的处理过程。
数据可视化旨在借助图形化手段,清晰有效地将数据中的各种属性和变量呈现出来,使用户可以从不同的维度观察数据,从而对数据进行更深入地观察和分析。
图表是指在屏幕中显示的、可以直观地展示统计信息、对知识挖掘和信息生动感受起关键作用的图形结构。
直方图,又称作质量分布图,它是由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据的类型,纵轴表示分布情況。
直方图可以利用方块的高度来反映数据的差异,只适用于中小规模的数据集,不适用于大规模的数据集。
折线图是用直线段将各数据点连接起来而组成的图形,以折线的方式显示数据的变化趋势。
折线图可以显示随时间变化的连续数据,适用于显示在相等时间间隔下数据的趋势。
条形图是用宽度相同的条形的高度或者长短来表示数据多少的图形,可以横置或纵置,纵置时也称为柱形图。
饼图可以显示一个数据序列中各项的大小与各项总和的比例,每个数据序列具有唯一的颜色或图形,并且与图例中的颜色是相对应的。
饼图可以很清晰地反映出各数据系列的百分比情况。
散点图是指数据点在直角坐标系平面上的分布图,通常用于比较跨类别的数据。散点图包含的数据点越多,比较的效果就会越好。
散点图中每个坐标点的位置是由变量的值决定的,用于表示因变量随自变量而变化的大致趋势,以判断两种变量的相关性。
箱形图又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情況资料的统计图。
图表类型 | 特点总结 |
---|---|
直方图 | 适于比较数据之间的多少。 |
折线图 | 反映一组数据的变化趋势。 |
条形图 | 显示各个项目之间的比较情况,和直方图有类似的作用。 |
散点图 | 显示若干数据系列中各数值之间的关系 |
箱形图 | 识别异常值方面有一定的优越性。 |
要想使用 Matplotlib绘制图表,需要先导入绘制图表的模块 pyplot,该模块提供了一种类似MATLAB的绘图方式,主要用于绘制简单或复杂的图形。
# 使用Matplotlib绘制图表,需要先导入绘制图表的模块pyplot
import matplotlib.pyplot as plt
如果要在 Jupyter Notebook中绘图,则需要增加如下命令
# 要在Jupyter Notebook中绘图,最好增加如下魔术命令:
%matplotlib inline
pyplot模块中默认有一个 Figure对象,该对象可以理解为一张空白的画布,用于容纳图表的各种组件。
data_one = np.arange(100, 150) # 生成包含100~150的数组
# 绘制data1折线图,如果传入了单个列表或数组,会将其设为Y轴序列,且自动生成X轴的序列并与Y轴具有相同的长度
plt.plot(data_one)
plt.show() # 在本机上显示图形
num:
表示图形的编号或名称。
figsize:
用于设置画布的尺寸。
facecolor:
用于设置画板的背景颜色。
edgecolor:
用于显示边框颜色。
# 创建新的空白画布,返回Figure实例
figure_obj = plt.figure()
data_two = np.arange(200, 301) # 生成包含200~300的数组
plt.figure(facecolor='gray') # 创建背景为灰色的新画布
# 通过data2绘制折线图,如果传入了单个列表或数组,会将其设为Y轴序列,
# 且自动生成X轴的序列并与Y轴具有相同的长度
plt.plot(data_two)
plt.show()
#创建宽度12英寸,高度8英寸,背景为红色的新画布
plt.figure(figsize=(12,8),facecolor='red')
plt.plot(data_two) # 通过data2绘制折线图
plt.show()
# 创建宽度12英寸,高度8英寸,图形分辨率60,背景为绿色的新画布
plt.figure(figsize=(12,8),dpi=60,facecolor='green')
plt.plot(data_two) # 通过data2绘制折线图
plt.show()
# 创建宽度12英寸,高度8英寸,图形分辨率120,背景为蓝色的新画布
plt.figure(figsize=(12,8),dpi=120,facecolor='blue' )
plt.plot(data_two) # 通过data2绘制折线图
plt.show()
Figure对象允许划分为多个绘图区域,每个绘图区域都是一个Axes对象,它拥有属于自己的坐标系统,被称为子图。
nrows, ncols:
表示子区网格的行数、列数。
index:
表示矩阵区域的索引。
subplot函数会将整个绘图区域等分为nrows(行)* ncols(列)”的矩阵区域
,之后按照从左到右、从上到下的顺序
对每个区域进行编号
。其中,位于左上角的子区域编号为1,依次递增。
nums = np.arange(0, 101) # 生成0~100的数组
# 分成2*2的矩阵区域,占用编号为1的区域,即第1行第1列的子图
plt.subplot(221)
# 在选中的子图上作图
plt.plot(nums, nums)
# 在本机上显示图形
plt.show()
nums = np.arange(0, 101) # 生成0~100的数组
# 分成2*2的矩阵区域,占用编号为1的区域,即第1行第1列的子图
plt.subplot(221)
# 在选中的子图上作图
plt.plot(nums, nums)
# 分成2*2的矩阵区域,占用编号为2的区域,即第1行第2列的子图
plt.subplot(222)
# 在选中的子图上作图
plt.plot(nums, -nums)
# 在本机上显示图形
plt.show()
nums = np.arange(0, 101) # 生成0~100的数组
# 分成2*2的矩阵区域,占用编号为1的区域,即第1行第1列的子图
plt.subplot(221)
# 在选中的子图上作图
plt.plot(nums, nums)
# 分成2*2的矩阵区域,占用编号为2的区域,即第1行第2列的子图
plt.subplot(222)
# 在选中的子图上作图
plt.plot(nums, -nums)
# 分成2*1的矩阵区域,占用编号为2的区域,即第2行的子图
plt.subplot(212)
# 在选中的子图上作图
plt.plot(nums, nums**2)
# 在本机上显示图形
plt.show()
如果 nrows、 ncols和 index这三个参数的值都小于10,则可以把它们简写为一个实数。
nrows, ncols:
表示子区网格的行数、列数
sharex, sharey:
表示控制x或y轴是否共享。
subplots()函数会返回一个元组
,元组的第一个元素为 Figure对象(画布)
,第二个元素为Axes对象(子图,包含坐标轴和画的图)或Axes对象数组
。如果创建的是单个子图,则返回的是一个Axes对象,否则返回的是一个Axes对象数组。
# 生成包含1~100之间所有整数的数组
nums = np.arange(1, 101)
# subplots()函数会返回一个元组,元组的第一个元素为Figure对象(画布),
# 第二个元素为Axes对象(子图,包含坐标轴和画的图)或Axes对象数组。
# 分成2*2的矩阵区域,返回子图数组axes
fig, axes = plt.subplots(2, 2)
# 生成包含1~100之间所有整数的数组
nums = np.arange(1, 101)
# 分成2*2的矩阵区域,返回子图数组axes
fig, axes = plt.subplots(2, 2)
ax1 = axes[0, 0] # 根据索引[0,0]从Axes对象数组中获取第1个子图
# 在选中的子图上作图
ax1.plot(nums, nums)
plt.show()
# 生成包含1~100之间所有整数的数组
nums = np.arange(1, 101)
# 分成2*2的矩阵区域,返回子图数组axes
fig, axes = plt.subplots(2, 2)
ax1 = axes[0, 0] # 根据索引[0,0]从Axes对象数组中获取第1个子图
ax2 = axes[0, 1] # 根据索引[0,1]从Axes对象数组中获取第2个子图
ax3 = axes[1, 0] # 根据索引[1,0]从Axes对象数组中获取第3个子图
ax4 = axes[1, 1] # 根据索引[1,1]从Axes对象数组中获取第4个子图
# 在选中的子图上作图
ax1.plot(nums, nums)
ax2.plot(nums, -nums)
ax3.plot(nums, nums**2)
ax4.plot(nums, np.log(nums))
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-et0QMCtj-1589338760944)(https://gitee.com/LiangPiHero/giteeForTypora/raw/master/Linux_imge/add_subplots()]方法_运行结果01.png)
上述方法中,* args参数表示一个三位数的实数或三个独立的实数,用于描述子图的位置。比如“a, b, c”,其中a和b表示将Figure对象分割成a*b大小的区域,c表示当前选中的要操作的区域。
例:
调用add_subplot()方法时传入的是“2,2,1”,则会在的2*2的矩阵中编号为1的区域上绘图。
# 创建Figure实例
fig = plt.figure(figsize=(12,8))
# 添加子图
fig.add_subplot(2, 2, 1)
# 创建一个随机数组
random_arr = np.random.randn(100)
# 在子图上作图,默认是在最后一次使用subplot的位置上作图,即编号为3的位置
plt.plot(random_arr)
plt.show()
# 创建Figure实例
fig = plt.figure(figsize=(12,8))
# 添加子图
fig.add_subplot(2, 2, 1)
fig.add_subplot(2, 2, 2)
fig.add_subplot(2, 2, 4)
fig.add_subplot(2, 2, 3)
# 创建一个随机数组
random_arr = np.random.randn(100)
# 在子图上作图,默认是在最后一次使用subplot的位置上作图,即编号为3的位置
plt.plot(random_arr)
plt.show()
# 创建Figure实例
fig = plt.figure(figsize=(12,8))
# 添加子图
fig.add_subplot(2, 2, 1)
fig.add_subplot(2, 2, 2)
fig.add_subplot(2, 2, 4)
fig.add_subplot(2, 2, 3)
# 创建一个随机数组
random_arr = np.random.randn(100)
# 在子图上作图,默认是在最后一次使用subplot的位置上作图,即编号为3的位置
plt.plot(random_arr)
fig.add_subplot(2, 2, 2) # 选中已添加的子图
plt.plot([1,2,3],[5,6,7])
plt.show()
每调用一次add_subplot()方法只会规划画布划分子图,且只会添加一个子图。当调用plot()函数绘制图形时,会画在最后一次指定子图的位置上。
绘图时可以为图形添加一些标签信息,比如标题、坐标名称、坐标轴的刻度等。
这些函数之间是并列关系,没有先后顺序,我们既可以先绘制图形,也可以先添加标签。值得一提的是,图例的添加只能在绘制完图形之后。
data = np.arange(0, 1.1, 0.01)
plt.figure(figsize=(12,8)) # 创建宽度12英寸,高度8英寸的画布
plt.title("Title") # 添加标题
plt.xlabel("liang") # 添加x轴的名称
plt.ylabel("pi") # 添加y轴的名称
# 设置x和y轴的刻度
plt.xticks([0, 0.5, 1])
plt.yticks([0, 0.6, 1.2])
plt.plot(data, data**2, label='y=x^2') # 绘制y=x^2曲线,label相对应
plt.plot(data, data**3, label='y=x^3') # 绘制y=x^3曲线
plt.legend(loc='best') # 添加图例,只能在绘制完图形之后,最佳位置
plt.show() # 在本机上显示图形
在python脚本中动态设置matplotlibrc,这样就可以避免由于更改配置文件而造成的麻烦。
# pylab结合了numpy和matplotlib.pyplot,对交互式是用来说比较方便,既可以画图又可以进行简单计算。
# 但是对于一个项目来说,最好分开使用numpy和pylot
# from pylab import mpl
# 设置显示中文字体
# rcParams 可以直接调用
mpl.rcParams[‘font.sans-serif] = [‘SimHei’]
由于字体更改以后,会导致坐标轴中的部分字符无法正常显示,这时需要更改axes.unicode_minus参数。
# 设置正常显示符号
mpl.rcParams['axes.unicode_minus'] = False
data = np.arange(0, 1.1, 0.01)
plt.figure(figsize=(12,8)) # 创建宽度12英寸,高度8英寸的画布
plt.title("Title标题") # 添加标题
plt.xlabel("x 轴") # 添加x轴的名称
plt.ylabel("y 轴",fontsize=20) # 添加y轴的名称
# 设置x和y轴的刻度
plt.xticks([0, 0.5, 1])
plt.yticks([0, 0.6, 1.2])
plt.plot(data, data**2, label='y=x^2') # 绘制y=x^2曲线
plt.plot(data, data**3, label='y=x^3') # 绘制y=x^3曲线
plt.legend(loc='best') # 添加图例,只能在绘制完图形之后
plt.show() # 在本机上显示图形
matplotlib.pyplot模块中包含了快速生成多种图表的函数。
hist()函数用于绘制直方图
x:
表示输入值。
bins:
表示绘制条柱的个数。
range:
bins的上下范围(最大和最小值)。
color:
表示条柱的颜色,默认为None。
arr_random = np.random.randn(100) # 创建随机数组
plt.hist(arr_random, bins=15, color='r', alpha=0.7) # 绘制直方图
plt.show() # 显示图形
scatter()函数用于绘制散点图
x, y:
表示x轴和y轴对应的数据。
s:
指定点的大小。
c:
指定散点的颜色。
marker :
表示绘制的散点类型。
alpha:
表示点的透明度,接收0~1之间的小数。
# 创建包含整数0~50的数组,用于表示x轴的数据
x = np.arange(51)
# 创建另一数组,用于表示y轴的数据
y = np.random.rand(51) * 10
plt.scatter(x, y,c='g') # 绘制散点图
plt.show()
用于绘制柱状图的函数为bar()
x:
表示x轴的数据。
height:
表示条形的高度。
width:
表示条形的宽度,默认为0.8。
color:
表示条形的颜色。
edgecolor:
表示条形边框的颜色。
# 创建包含0~4的一维数组
x = np.arange(5)
# 从上下限范围内随机选取整数,创建两个2行5列的数组
y1, y2 = np.random.randint(1, 31, size=(2, 5))
width = 0.25 # 条形的宽度
ax = plt.subplot(1,1,1)
ax.bar(x, y1, width, color='y') # 绘制黄色的柱形图
ax.bar(x+width, y2, width, color='g') # 绘制另一个绿色的柱形图
ax.set_xticks(x+width) # 设置x轴的刻度
# 设置x轴的刻度标签
ax.set_xticklabels(['January', 'February', 'March', 'April ', 'May '])
plt.show()
在使用绘制图表的函数(比如plot等)画图时,可以设定线条的相关参数,包括颜色、线型和标记风格。
线条颜色使用color参数控制,它支持如下表所列举的颜色值。
线型使用linestyle参数控制,它支持如下表所列举的线型值。
标记风格使用marker参数控制,它支持如右表所列举的标记值。
data = np.arange(1, 3, 0.3)
# 绘制直线,颜色为青色,标记为“x”,线型为长虚线
plt.plot(data, color="c", marker="x", linestyle="--")
# 绘制直线,颜色为品红,标记为实心圆圈,线型为短虚线
plt.plot(data+1, color="m", marker="o", linestyle=":")
# 绘制直线,颜色为黑色,标记为五边形,线型为短点相间线
plt.plot(data+2, color="k", marker="p", linestyle="-.")
plt.show()
data = np.arange(1, 3, 0.3)
# 也可采用下面的方式绘制三条不同颜色、标记和线型的直线
plt.plot(data, 'cx--', data+1, 'mo:', data+2, 'kp-.')
# 保存当前生成的图表,须在显示图形之前
plt.savefig('demo3.png')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqefF8E8-1589338760952)(https://gitee.com/LiangPiHero/giteeForTypora/raw/master/Linux_imge/本地保存图形_savefig()]函数运行结果01.png)
fname参数是一个包含文件名路径的字符串,或者是一个类似于Python文件的对象。如果format 参数设为None且fname参数是一个字符串,则输出格式将根据文件名的扩展名推导出来。
# 创建包含100个数值的随机数组
random_arr = np.random.randn(100)
# 将随机数组的数据绘制线形图
plt.plot(random_arr)
# 保存当前生成的图表,须在显示图形之前
plt.savefig('demo.png')
plt.show()
Seaborn基于Matplotlib核心库进行了更高级的API封装,可以轻松地画出更漂亮的图形,而Seaborn的漂亮主要体现在配色更加舒服,以及图形元素的样式更加细腻。
import seaborn as sb
# 使用Matplotlib绘制图表,需要先导入绘制图表的模块pyplot
import matplotlib.pyplot as plt
# 要在Jupyter Notebook中绘图,最好增加如下魔术命令:
%matplotlib inline
当处理一组数据时,通常先要做的就是了解变量是如何分布的。
对于单变量,采用直方图
默认绘制一个带有核密度估计曲线的直方图
a:
表示要观察的数据。
bins:
用于控制条形的数量。
hist:
表示是否绘制(标注)直方图。
kde:
表示是否绘制高斯核密度估计曲线。
rug:
表示是否在支持的轴方向上绘制rugplot。
如果希望使用Seaborn用Matplotlib的默认样式,则需要**显式地调用set()或set_style()、set_context()和set_palette()中的一个或多个函数**,以获取Seaborn或者Matplotlib默认的绘图样式。
sb.set() # 显式调用set()获取默认绘图样式
np.random.seed(0) # 确定随机数生成器的种子
arr = np.random.randn(100) # 生成随机数组
# Seaborn中提供了一个distplot()函数,它默认绘制的是一个带有核密度估计曲线的直方图
ax = sb.distplot(arr, bins=10) # 绘制直方图
直方图会因为条柱数量的不同导致图表的效果有着很大的差异,为了解决这个问题,可以绘制核密度估计曲线进行展现。
核密度估计是在概率论中用来估计未知的密度函数,属于非参数检验方法之一,可以比较直观的看出数据样本本身的分布特征。
# 创建包含500个位于[0,100]之间整数的随机数组
array_random = np.random.randint(0, 100, 500)
# 通过distplot()函数 绘制核密度估计曲线
sb.distplot(array_random, hist=False, rug=True)
创建一个多面板图形,以显示两个变量之间的关系及每个变量在单独坐标轴上的单变量分布。
# 创建DataFrame对象
dataframe_obj = pd.DataFrame({"x": np.random.randn(500),"y": np.random.randn(500)})
# 通过jointplot()函数可以创建一个多面板图形,
# 以显示两个变量之间的关系及每个变量在单独坐标轴上的单变量分布
# kind参数默认为"scatter"散点图
sb.jointplot(x="x", y="y", data=dataframe_obj)
# 调用jointplot()函数时只要传入kind=“hex”可以绘制二维直方图
# kind="hex"六边形直方图,根据六边形色块颜色判断
sb.jointplot(x="x", y="y", data=dataframe_obj, kind="hex")
# 调用jointplot()函数时传入kind=“kde”可以绘制核密度估计图形
# 颜色越深密度越大
sb.jointplot(x="x", y="y", data=dataframe_obj, kind="kde")
要想在数据集中绘制多个成对的双变量分布,则可以使用pairplot()函数实现,该函数会创建一个坐标轴矩阵,并且显示DataFrame对象中每对变量的关系。
Seaborn中内置的所有数据集,可点击链接 https://github.com/mwaskom/seaborn-data进行查看。
# Requests: 最友好的网络爬虫功能库
import requests
html_data = requests.get('https://github.com/mwaskom/seaborn-data/blob/master/tips.csv')
html_data
tips = pd.read_html(html_data.content)
tips[0]
dataset = tips[0]
del dataset['Unnamed: 0'] # 删除'Unnamed: 0'列数据,数据预处理
dataset
# 绘制多个成对的双变量分布
sb.pairplot(dataset)
数据集中的数据类型有很多种,除了连续的特征变量之外,最常见的就是类目型
的数据类型了。
x,y,hue:
用于绘制长格式数据的输入。
data:
用于绘制的数据集。如果x和y不存在,则它将作为宽格式,否则将作为长格式。
order,hue_order:
用于绘制分类的级别。
jitter:
表示抖动的程度(仅沿类别轴)。
tips = dataset
tips
# 可以在调用stripplot()函数时传入jitter参数,以调整横坐标的位置
sb.stripplot(x="day", y="total_bill", data=tips, jitter=True)
# 调用swarmplot() 函数绘制散点图,该函数的好处就是所有的数据点都不会重叠
sb.swarmplot(x="day", y="total_bill", data=tips)
散点图不能够直观地反映出各个分类的数据分布,为此,可以绘制箱形图和提琴图两种图形查看
绘制箱形图
orient:
表示数据垂直或水平显示,取值为“v” | “h”。
palette:
用于设置不同级别色相的颜色变量。
saturation:
用于设置数据显示的颜色饱和度。
# seaborn中用于绘制箱形图的函数为boxplot()
sb.boxplot(x="day", y="total_bill", data=tips)
sb.boxenplot(x="day", y="total_bill", data=tips)
通过violinplot()函数可以绘制提琴图
# 通过 violinplot() 函数绘制提琴图
# 提琴图是箱形图与核密度图的结合,它可以展示任意位置的密度,很直观地看到哪些位置的密度较高
sb.violinplot(x="day", y="total_bill", data=tips)
要想查看每个分类的集中趋势,则可以使用条形图和点图进行展示,Seaborn库中用于绘制这两种图表的具体函数如下:
默认情况下,barplot()函数会在整个数据集上使用均值进行估计。
# 类别内的统计估计
# 要想查看每个分类的集中趋势,则可以使用条形图和点图进行展示
# barplot()函数:用于绘制条形图
sb.barplot(x="day", y="total_bill", data=tips)
用于估计的图形是点图
pointplot()函数会用高度估计值对数据进行描述,而不是显示完整的条形,它只会绘制点估计和置信区间。
# pointplot()函数:用于绘制点图
sb.pointplot(x="day", y="total_bill", data=tips)
Bokeh是针对浏览器使用的交互式可视化库,它旨在提供优雅、简洁的通用图形,帮助程序员快速地、轻松地创建交互图、数据应用程序等。
Bokeh库捆绑了多种语言,包括Python、R语言、lua和Julia,结合这些语言产生了JSON文档
,此文档将作为BokehJS(JavaScript库)的输入,之后将数据展示到Web浏览器上面。
使用plotting创建图表的基本步骤如下:
from bokeh.plotting import figure, output_notebook, show
# 输出到电脑屏幕上
output_notebook()
fig_obj = figure(plot_width=400, plot_height=400)
# 添加矩形框,标有大小、颜色和alpha值
fig_obj.square([2, 5, 6, 4], [2, 3, 2, 1], size=20, color="navy")
# 在默认的浏览器中显示图表
show(fig_obj)