Python五种方式实现可视化,包括动态图表展示(matplotlib、seaborn、plotly、bokeh、pyecharts)——matplotlib传记

一、matplotlib简介

1、介绍

matplotlib是一个功能强大的Python绘图库,用于创建各种类型的图形和可视化数据。它提供了广泛的绘图功能和灵活的配置选项,可以满足不同需求下的数据可视化需求。

2、主要特点
matplotlib的主要特点包括:

简单易用:matplotlib的API设计简单直观,使用起来非常方便。它的语法和Matlab绘图库相似,对于熟悉Matlab的用户来说更容易上手。

多种图形类型:matplotlib支持多种类型的图形,包括折线图、散点图、柱状图、饼图、直方图、箱线图、热力图等。用户可以根据数据类型和需求选择合适的图形类型。

高度可定制:matplotlib提供了丰富的配置选项,用户可以自定义图形的样式、颜色、标签、标题、轴标签等。通过配置选项,可以灵活地调整图形的外观和布局,以满足个性化的需求。

支持多种输出格式:matplotlib可以将图形输出为多种格式,包括图片文件(如PNG、JPEG)、PDF、SVG等。用户可以根据需要选择合适的输出格式,方便地将图形用于报告、文档或网页中。

丰富的扩展库:matplotlib生态系统非常丰富,有许多扩展库可以与之配合使用,如Seaborn、Pandas等。这些扩展库提供了更高级的绘图功能和更方便的数据处理工具,进一步提升了matplotlib的使用体验和效果。

总之,matplotlib是一个功能强大且灵活的Python绘图库,适用于各种数据可视化需求。无论是初学者还是专业人士,都可以通过matplotlib轻松地创建出精美的图形,并更好地理解和分析数据。
3、matplotlib库可以实现多种类型的图形,包括但不限于以下几种:
折线图(Line Plot):用于显示连续数据的趋势和变化。
散点图(Scatter Plot):用于显示两个变量之间的关系和分布。
柱状图(Bar Plot):用于比较不同类别或组之间的数值。
条形图(Barh Plot):用于水平展示柱状图。
饼图(Pie Chart):用于显示数据的相对比例和占比。
直方图(Histogram):用于显示数据的分布情况。
箱线图(Box Plot):用于显示数据的分散情况和异常值。
热力图(Heatmap):用于显示数据的矩阵关系。
3D图形(3D Plots):包括3D散点图、3D曲面图等。
等高线图(Contour Plot):用于显示二维数据的等高线。
极坐标图(Polar Plot):用于显示数据在极坐标系下的分布。
简单地理图(Simple Maps):用于显示地理数据的简单地图。
除了上述常见的图形类型,matplotlib库还提供了许多其他类型的图形,同时也支持自定义图形的样式、颜色、标签等。通过使用matplotlib库,可以根据具体的需求和数据类型选择合适的图形类型,并灵活地进行定制和配置,以实现所需的数据可视化效果。
4、基本属性设置
matplotlib库提供了丰富的属性设置,用于自定义图形的样式和外观。以下是常用的属性设置:

颜色设置:
color:设置图形的颜色,可以使用预定义的颜色名称(如'red'、'blue'等),也可以使用RGB值或十六进制颜色码。
edgecolor:设置图形边缘的颜色。
facecolor:设置图形内部的填充颜色。

线型设置:
linestyle:设置线条的样式,如实线、虚线等。
linewidth:设置线条的宽度。

标记设置:
marker:设置标记的样式,如圆圈、方形等。
markersize:设置标记的大小。

文本设置:
fontsize:设置文本的字体大小。
fontweight:设置文本的字体粗细。
fontfamily:设置文本的字体族。

图例设置:
legend:设置图例的位置和样式。
label:设置图例的标签。

坐标轴设置:
xlabel:设置x轴的标签。
ylabel:设置y轴的标签。
xticks:设置x轴刻度的位置和标签。
yticks:设置y轴刻度的位置和标签。

图形大小和边距设置:
figsize:设置图形的大小。
dpi:设置图形的分辨率。
tight_layout:自动调整子图的布局,使其适应图形大小。
以上只是一些常用的属性设置,matplotlib还提供了更多的属性和方法,用于进一步自定义图形的样式和外观。可以通过查阅matplotlib的官方文档来获取更详细的信息。

(1)颜色设置:

在matplotlib中,可以使用RGB值或十六进制颜色码来设置图形的颜色。以下是一些常用的颜色的RGB值和十六进制颜色码:

预定义颜色名称:
'red':红色
'blue':蓝色
'green':绿色
'yellow':黄色
'orange':橙色
'purple':紫色
'brown':棕色
'gray':灰色
'black':黑色
'white':白色

RGB值:
(1, 0, 0):红色
(0, 0, 1):蓝色
(0, 1, 0):绿色
(1, 1, 0):黄色
(1, 0.5, 0):橙色
(0.5, 0, 0.5):紫色
(0.6, 0.4, 0.2):棕色
(0.5, 0.5, 0.5):灰色
(0, 0, 0):黑色
(1, 1, 1):白色

十六进制颜色码:
'#FF0000':红色
'#0000FF':蓝色
'#00FF00':绿色
'#FFFF00':黄色
'#FFA500':橙色
'#800080':紫色
'#996633':棕色
'#808080':灰色
'#000000':黑色
'#FFFFFF':白色
可以根据需要选择合适的颜色来设置图形的外观。

(2)线型设置:

linestyle属性用于设置线条的样式,可以通过以下属性值来设置线条的样式:
实线样式:
'-':实线
'solid':实线

虚线样式:
'--':破折线
'dashed':破折线

点线样式:
':':点线
'dotted':点线

点划线样式:
'-.':点划线
'dashdot':点划线
除了上述属性值外,还可以使用自定义的线型设置,例如使用一个由线段长度和间隔长度组成的元组来表示虚线的样式,如(10, 5)表示线段长度为10,间隔长度为5的虚线。
示例代码:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y, linestyle='-', color='blue')  # 使用实线样式
plt.plot(x, y, linestyle='--', color='red')  # 使用虚线样式
plt.plot(x, y, linestyle=':', color='green')  # 使用点线样式
plt.plot(x, y, linestyle='-.', color='purple')  # 使用点划线样式
plt.plot(x, y, linestyle=(10, 5), color='orange')  # 使用自定义虚线样式
plt.show()

(3)标记设置:

marker属性用于设置数据点的标记样式,可以通过以下属性值来设置标记的样式:
点样式:
'.':小圆点
'o':实心圆点
'v':下三角形
'^':上三角形
'<':左三角形
'>':右三角形
'1':下指针
'2':上指针
'3':左指针
'4':右指针
's':正方形
'p':五边形
'*':星形
'h':六边形1
'H':六边形2
'+':加号
'x':叉号
'D':菱形
'd':瘦菱形
'|':垂直线
'_':水平线

自定义标记样式:
使用元组 (marker, size) 来自定义标记样式,其中 marker 表示标记的形状,size 表示标记的大小。
示例代码:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y, marker='.', linestyle='-', color='blue')  # 使用小圆点作为标记
plt.plot(x, y, marker='o', linestyle='-', color='red')  # 使用实心圆点作为标记
plt.plot(x, y, marker='v', linestyle='-', color='green')  # 使用下三角形作为标记
plt.plot(x, y, marker='^', linestyle='-', color='purple')  # 使用上三角形作为标记
plt.plot(x, y, marker='s', linestyle='-', color='orange')  # 使用正方形作为标记
plt.plot(x, y, marker=('D', 8), linestyle='-', color='black') # 使用自定义标记样式
plt.show()
运行上述代码将会绘制出不同样式的标记点。

(4)文本设置:

文本设置属性用于设置文本的样式和属性,可以通过以下属性来设置文本的样式:

fontfamily:设置文本的字体族(如 'serif'、'sans-serif'、'cursive'、'fantasy'、'monospace'等)。
fontsize:设置文本的字体大小(如 'large'、'x-large'、'smaller'、'larger'等)。
fontweight:设置文本的字体粗细(如 'normal'、'bold'、'light'、'heavy'等)。
fontstyle:设置文本的字体风格(如 'normal'、'italic'、'oblique'等)。
color:设置文本的颜色(如 'red'、'blue'、'green'等)。
backgroundcolor:设置文本的背景颜色(如 'yellow'、'lightblue'、'pink'等)。
horizontalalignment:设置文本的水平对齐方式(如 'left'、'center'、'right'等)。
verticalalignment:设置文本的垂直对齐方式(如 'top'、'center'、'bottom'等)。
rotation:设置文本的旋转角度。
bbox:设置文本的边框样式和属性(如边框颜色、边框粗细等)。
示例代码:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.text(2, 10, 'Sample Text', fontfamily='serif', fontsize='x-large', fontweight='bold', 
         fontstyle='italic', color='red', backgroundcolor='yellow', 
         horizontalalignment='center', verticalalignment='center', 
         rotation=45, bbox=dict(facecolor='lightblue', edgecolor='blue', linewidth=2))
plt.show()
运行上述代码将会绘制出一条曲线和一个带有样式设置的文本。

(5)图例设置:

图例设置属性用于设置图例的样式和属性,可以通过以下属性来设置图例的样式:
loc:设置图例的位置(如 'upper right'、'lower left'、'center'等)。
bbox_to_anchor:设置图例的位置,以坐标轴为参考点进行设置。
title:设置图例的标题。
fontsize:设置图例的字体大小。
frameon:设置图例是否显示边框。
framealpha:设置图例边框的透明度。
ncol:设置图例的列数。
markerscale:设置图例标记的缩放比例。
title_fontsize:设置图例标题的字体大小。
shadow:设置图例是否显示阴影。
示例代码:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y1 = [1, 4, 9, 16, 25]
y2 = [1, 2, 3, 4, 5]
plt.plot(x, y1, label='Line 1')
plt.plot(x, y2, label='Line 2')
plt.legend(loc='upper right', title='Legend', fontsize='large', frameon=True, framealpha=0.8, 
           ncol=2, markerscale=1.5, title_fontsize='x-large', shadow=True)
plt.show()
运行上述代码将会绘制出两条曲线和一个带有样式设置的图例。

(6)坐标轴设置:

坐标轴设置属性用于设置坐标轴的样式和属性,可以通过以下属性来设置坐标轴的样式:

xlabel:设置 x 轴的标签。
ylabel:设置 y 轴的标签。
xlim:设置 x 轴的显示范围。
ylim:设置 y 轴的显示范围。
xticks:设置 x 轴的刻度值。
yticks:设置 y 轴的刻度值。
xscale:设置 x 轴的刻度缩放(如 'linear'、'log'、'symlog'等)。
yscale:设置 y 轴的刻度缩放(如 'linear'、'log'、'symlog'等)。
grid:设置是否显示坐标轴网格线。
gridcolor:设置坐标轴网格线的颜色。
gridlinestyle:设置坐标轴网格线的样式。
gridlinewidth:设置坐标轴网格线的宽度。
tick_params:设置刻度线的样式和属性(如刻度线的长度、宽度、颜色等)。
示例代码:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.xlabel('X-axis', fontsize='large')
plt.ylabel('Y-axis', fontsize='large')
plt.xlim(0, 6)
plt.ylim(0, 30)
plt.xticks([1, 2, 3, 4, 5], ['A', 'B', 'C', 'D', 'E'], rotation=45)
plt.yticks([0, 10, 20, 30], ['0', '10', '20', '30'])
plt.xscale('linear')
plt.yscale('linear')
plt.grid(True, color='gray', linestyle='--', linewidth=0.5)
plt.tick_params(axis='both', which='both', length=5, width=1, color='black')
plt.show()
运行上述代码将会绘制出一条曲线,并设置了坐标轴的样式和属性。

二、matplotlib实战

1、折线图的实现

简介:

折线图(Line plot)是一种用于展示数据随着时间、顺序或其他连续变量的变化趋势的图表。它通过连接数据点的线段来显示数据的变化情况,可以帮助我们观察和分析数据的趋势、周期性和关联性。
折线图的主要特点和作用如下:
变化趋势观察:折线图可以显示数据随时间或其他连续变量的变化趋势,帮助我们观察和分析数据的增长、下降、波动等情况。
周期性分析:对于具有周期性的数据,折线图可以清晰地展示数据的周期性变化,如季节性变化、周期性波动等。
关联性分析:当有多组相关数据时,可以通过绘制多条折线来比较它们之间的关联性和趋势,从而观察它们的相似性或差异性。
异常值检测:折线图可以帮助我们发现数据中的异常值,即与其他数据点相比较为异常的数值。
数据预测和预测模型评估:通过观察折线图的趋势,我们可以对未来的数据进行预测,并评估预测模型的准确性和可靠性。
数据可视化:折线图是一种直观、简洁的方式来展示数据的变化趋势,可以用于报告、演示和与他人分享数据。
折线图通常在时间序列分析、趋势分析、市场分析、科学实验等领域广泛应用。通过观察和分析折线图,我们可以更好地理解数据的变化情况,进而做出更准确的决策和预测。

(1)简单折线图(基本每行代码都有注解,大家可以参考,实现方式多种多样)

import matplotlib.pyplot as plt
import numpy as np
# x,y轴的数据生成
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图形和坐标轴(plt.figure(figsize=(12, 4)),设置了图形的大小为宽度为12英寸,高度为4英寸)
fig, ax = plt.subplots(figsize=(12, 4))
# 绘制曲线,设置y轴标签和曲线颜色
ax.plot(x, y, label='sin(x)',color='red')
# 添加标题和标签
ax.set_title('Sine Wave')
ax.set_xlabel('x')
ax.set_ylabel('sin(x)')
# 添加图例
ax.legend()
# 保存图形
plt.savefig('line_plot.png')
# 显示图形
plt.show()

结果如下所示:

(2)多条折线图

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
fig, ax = plt.subplots(figsize=(12, 4),dpi=80)
x = ['第一季度','第二季度','第三季度','第四季度']
y1 = [288,197,456,210]
y2 = [110,256,376,121]
y3 = [260,356,277,300]
plt.plot(x, y1, label = 'Line1',marker='o')
plt.plot(x, y2, label = 'Line2', marker='*')
plt.plot(x, y3, label = 'Line3',marker='^')
plt.show()

结果如下:

(3)循环实现多条折线图

import matplotlib.pyplot as plt
# 定义数据
x = [1, 2, 3, 4, 5]
y_list = [[1, 4, 9, 16, 25], [1, 2, 3, 4, 5], [5, 4, 3, 2, 1]]
y_marker = ['*','o','^']
# 创建画布
plt.figure(figsize=(8, 4), dpi=100)
# 循环绘制每一条折线图
for i in range(len(y_list)):
    plt.plot(x, y_list[i],marker=y_marker[i])
# 显示图形
plt.show()

结果如下:

(4)实现不连续的折线图

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y, linestyle='--')
plt.show()

结果如下:

(5)区域填充的折线图

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.fill_between(x, y, color='gray', alpha=0.5)
plt.show()

结果如下:

#绘制折线图
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #正常显示负号
year = [2017, 2018, 2019, 2020]
people = [20, 40, 60, 70]
#生成图表
plt.plot(year, people)
plt.xlabel('年份')
plt.ylabel('人口')
plt.title('人口增长')
#设置纵坐标刻度
plt.yticks([0, 20, 40, 60, 80])
#设置填充选项:参数分别对应横坐标,纵坐标,纵坐标填充起始值,填充颜色
plt.fill_between(year, people, 20, color = 'green')
#显示图表
plt.show()

结果如下:

到这里折线图的介绍基本结束,大家可以根据不同属性进行不同折线图的实现。

2、柱状图的实现

简介:

柱状图(Bar chart)是一种用于展示不同类别或组之间数量或频率比较的图表。它通过绘制垂直或水平的矩形柱来表示数据,柱的高度表示数据的大小,可以帮助我们直观地比较不同类别或组之间的差异。
柱状图的主要特点和作用如下:
数据比较:柱状图可以清晰地显示不同类别或组之间的数量或频率差异,帮助我们比较和分析数据的大小、趋势和关系。
类别分布观察:通过柱状图,我们可以观察和分析不同类别或组的数据分布情况,了解每个类别或组的相对大小和比例。
异常值检测:柱状图可以帮助我们发现数据中的异常值,即与其他类别或组相比较为异常的数值。
排序和排序比较:通过对柱状图进行排序,我们可以更好地理解数据的排序情况,并比较不同类别或组之间的排序差异。
数据可视化:柱状图是一种直观、简洁的方式来展示数据的比较和分布情况,可以用于报告、演示和与他人分享数据。
柱状图常用于市场调研、销售分析、统计报告、民意调查等领域。通过观察和分析柱状图,我们可以更好地理解数据的差异和趋势,有助于做出更准确的决策和预测。

(1)简单柱状图

import matplotlib.pyplot as plt
x = ['A', 'B', 'C', 'D']
y = [10, 15, 7, 12]
plt.bar(x, y)
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('基本柱状图')
plt.show()

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 0.准备数据
# 电影名字
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
# 横坐标
x = range(len(movie_name))
# 票房数据
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制柱状图
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g','b'])
# 2.1b修改x轴的刻度显示
plt.xticks(x, movie_name)
# 2.2 添加网格显示
plt.grid(linestyle="--", alpha=0.5)
# 2.3 添加标题
plt.title("电影票房收入对比")
# 3.显示图像
plt.show()


(2)多个柱状图

import numpy as np
import matplotlib.pyplot as plt
x = ['A', 'B', 'C', 'D']
y1 = [10, 15, 7, 12]
y2 = [8, 11, 9, 14]
width = 0.35
x_indexes = np.arange(len(x))
plt.bar(x_indexes - width/2, y1, width=width, label='柱状图1')
plt.bar(x_indexes + width/2, y2, width=width, label='柱状图2')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('多个柱状图')
plt.xticks(x_indexes, x)
plt.legend()
plt.show()


(3)堆叠柱状图:

import numpy as np
import matplotlib.pyplot as plt
x = ['A', 'B', 'C', 'D']
y1 = [10, 15, 7, 12]
y2 = [8, 11, 9, 14]
x_indexes = np.arange(len(x))
plt.bar(x_indexes, y1, label='柱状图1')
plt.bar(x_indexes, y2, bottom=y1, label='柱状图2')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('堆叠柱状图')
plt.xticks(x_indexes, x)
plt.legend()
plt.show()


(4)水平柱状图:

import matplotlib.pyplot as plt
y = ['A', 'B', 'C', 'D']
x = [10, 15, 7, 12]
plt.barh(y, x)
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('水平柱状图')
plt.show()


(5)带误差线的柱状图:

import matplotlib.pyplot as plt
import numpy as np

# 柱形图误差线
# 1. 生成数据
np.random.seed(20230811)
x = np.arange(10)
y = np.random.randint(20, 100, 10)
yerr = np.random.randint(3, 10, 10)

# 2. 创建画布
fig = plt.figure(figsize=(6, 4), dpi=100)
ax = fig.add_subplot(111)

# 3. 绘制柱形图
ax.bar(x, y, width=0.5, color='C0', yerr=yerr, capsize=5)

# 4. 设置样式
ax.grid(axis='y', linestyle='--')
ax.set_axisbelow(True)
ax.spines[['right', 'top']].set_color('C7')
plt.show()

3、饼状图的实现

简介:

饼图(Pie chart)是一种用于展示不同类别或组之间数量或比例关系的图表。它通过绘制一个圆形,将圆形划分为不同扇形区域,每个扇形区域的角度大小表示该类别或组的比例或百分比。
饼图的主要特点和作用如下:
比例展示:饼图可以直观地展示不同类别或组之间的比例关系,通过扇形区域的大小来表示每个类别或组的占比。
百分比分布观察:通过饼图,我们可以观察和分析不同类别或组的百分比分布情况,了解每个类别或组的相对大小和比例。
类别占比比较:饼图可以帮助我们比较不同类别或组之间的占比差异,从而更好地理解数据的分布情况。
强调重点:通过调整饼图中某个扇形区域的大小,可以突出某个类别或组的重要性或特殊性。
数据可视化:饼图是一种直观、简洁的方式来展示数据的比例和分布情况,可以用于报告、演示和与他人分享数据。
饼图常用于市场份额分析、调查结果展示、资源分配比例等领域。通过观察和分析饼图,我们可以更好地理解数据的比例关系,有助于做出更准确的决策和预测。需要注意的是,饼图适用于展示相对比例或百分比的数据,不适合展示大量类别或组之间的细节差异。

(1)基础实心饼状图

import matplotlib.pyplot as plt

plt.figure(figsize=(6,3), dpi=100)
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
plt.pie(sizes, labels=labels, shadow=True)
plt.axis('equal')
plt.legend()
plt.show()


(2)加强版实心饼状图

import matplotlib.pyplot as plt

# 设置字体以便支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 设置图片大小和分辨率
plt.figure(figsize=(6,3), dpi=100)
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
#突出显示某一块
explode = (0, 0.1, 0, 0)
#设置颜色
colors = ['red', 'green', 'blue', 'yellow']
# autopct='%1.1f%%', shadow=True:显示占比和图形阴影
plt.pie(sizes, labels=labels,explode=explode , colors=colors,autopct='%1.1f%%', shadow=True)
#axis 是一个用于控制图形坐标轴显示和范围的重要属性:
plt.axis('equal')
plt.title('占比图')
plt.legend()
plt.show()


(3)加强版环状饼状图

import matplotlib as mpl
import matplotlib.pyplot as plt

# 配置字体,显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']  
# 配置坐标轴刻度值模式,显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 定义数据
elements = ['面粉', '砂糖', '牛奶', '草莓酱', '坚果']
weight1 = [40, 15, 20, 10, 15]
cs = ['red', 'orange', 'yellow', 'green', 'cyan']
# 对数据进行排序
x = list(zip(elements, weight1, cs))
x.sort(key=lambda e: e[1], reverse=True)
[elements, weight1, cs] = list(zip(*x))
outer_cs = cs
inner_cs = cs
# 初始化图表区
fig = plt.figure(figsize=(12, 8),facecolor='cornsilk')
# 绘制外层圆环
wedges1, texts1, autotexts1 = plt.pie(x=weight1,
                                      autopct='%3.1f%%',
                                      radius=1,
                                      pctdistance=0.85,
                                      startangle=90,
                                      counterclock=False,
                                      colors=outer_cs,
                                      # 锲形块边界属性字典
                                      wedgeprops={'edgecolor': 'white',
                                                  'linewidth': 1,
                                                  'linestyle': '-'
                                                  },
                                      # 锲形块标签文本和数据标注文本的字体属性
                                      textprops=dict(color='k',  #  字体颜色
                                                     fontsize=14,
                                                     family='Arial'               ) )
# 绘制中心空白区域
plt.pie(x=[1],
        radius=0.6,
        colors=[fig.get_facecolor()]
       )
# 设置图例
plt.legend(handles=wedges1,
           loc='best',
           labels=elements,
           title='配料表',
           facecolor = fig.get_facecolor(),    # 图例框的填充颜色
           edgecolor='darkgray',
           fontsize=12        
          )
plt.title(label='果酱面包的配料表占比',
          color='blue',
          size=15,
          weight='bold'
         );


(4)加强版环中环状饼状图

# 配置字体,显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']  
# 配置坐标轴刻度值模式,显示负号
mpl.rcParams['axes.unicode_minus'] = False

# 定义数据
elements = ['面粉', '砂糖', '牛奶', '草莓酱', '坚果']
weight1 = [40, 15, 20, 10, 15]
weight2 = [30, 25, 15, 20, 10]
cs = ['red', 'orange', 'yellow', 'green', 'cyan']

# 对数据进行排序
x = list(zip(elements, weight1, weight2, cs))
x.sort(key=lambda e: e[1], reverse=True)
[elements, weight1, weight2, cs] = list(zip(*x))

# 初始化图表区
fig = plt.figure(figsize=(12, 8),
                 facecolor='cornsilk'
                )

# 绘制外层圆环
wedges1, texts1, autotexts1 = plt.pie(x=weight1,
                                      autopct='%3.1f%%',
                                      radius=1,
                                      pctdistance=0.85,
                                      startangle=90,
                                      counterclock=False,
                                      colors=cs,
                                      # 锲形块边界属性字典
                                      wedgeprops={'edgecolor': 'white',
                                                  'linewidth': 1,
                                                  'linestyle': '-'
                                                  },
                                      # 锲形块标签文本和数据标注文本的字体属性
                                      textprops=dict(color='k',  #  字体颜色
                                                     fontsize=14,
                                                     family='Arial'               
                                                     ))
# 绘制内层圆环
wedges2, texts2, autotexts2 = plt.pie(x=weight2,
                                      autopct='%3.1f%%',
                                      radius=0.7,
                                      pctdistance=0.75,
                                      startangle=90,
                                      counterclock=False,
                                      colors=inner_cs,
                                      # 锲形块边界属性字典
                                      wedgeprops={'edgecolor': 'white',
                                                  'linewidth': 1,
                                                  'linestyle': '-'
                                                  },
                                      # 锲形块标签文本和数据标注文本的字体属性
                                      textprops=dict(color='k',  #  字体颜色
                                                     fontsize=14,
                                                     family='Arial'
                                                     ))
# 绘制中心空白区域
plt.pie(x=[1],
        radius=0.4,
        colors=[fig.get_facecolor()]
       )
# 设置图例
plt.legend(handles=wedges1,
           loc='best',
           labels=elements,
           title='配料表',
           facecolor = fig.get_facecolor(),    # 图例框的填充颜色
           edgecolor='darkgray',
           fontsize=12        
          )
plt.title(label='不同果酱面包的配料表比较',
          color='blue',
          size=15,
          weight='bold'
         );

(5)综合饼状图

from matplotlib import font_manager as fm
from  matplotlib import cm
import pandas as pd
shapes = ['Cross', 'Cone', 'Egg', 'Teardrop', 'Chevron', 'Diamond', 'Cylinder',
       'Rectangle', 'Flash', 'Cigar', 'Changing', 'Formation', 'Oval', 'Disk',
       'Sphere', 'Fireball', 'Triangle', 'Circle', 'Light']
values = [  287,   383,   842,   866,  1187,  1405,  1495,  1620,  1717,
        2313,  2378,  3070,  4332,  5841,  6482,  7785,  9358,  9818, 20254]
s = pd.Series(values, index=shapes)
labels = s.index
sizes = s.values
explode = (0.1,0,0,0,0,0,0,0,0,0,0,0,0,0.2,0,0,0,0.1,0)  # "explode" , show the selected slice
fig, axes = plt.subplots(figsize=(8,5),ncols=2,dpi=100) # 设置绘图区域大小
ax1, ax2 = axes.ravel()
colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # colormaps: Paired, autumn, rainbow, gray,spring,Darks
patches, texts, autotexts = ax1.pie(sizes, labels=labels, autopct='%1.0f%%',explode=explode,
        shadow=False, startangle=170, colors=colors, labeldistance=1.2,pctdistance=1.03, radius=0.4)
# labeldistance: 控制labels显示的位置
# pctdistance: 控制百分比显示的位置
# radius: 控制切片突出的距离
ax1.axis('equal')  
# 重新设置字体大小
proptease = fm.FontProperties()
proptease.set_size('xx-small')
# font size include: ‘xx-small’,x-small’,'small’,'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'
plt.setp(autotexts, fontproperties=proptease)
plt.setp(texts, fontproperties=proptease)
ax1.set_title('Shapes', loc='center')
# ax2 只显示图例(legend)
ax2.axis('off')
ax2.legend(patches, labels, loc='center left')
plt.tight_layout()
# plt.savefig("pie_shape_ufo.png", bbox_inches='tight')
plt.savefig('Demo_project_final.jpg')
plt.show()

4、箱型图的实现

简介:https://www.yingsoo.com/news/devops/44361.html

箱型图(Boxplot)是一种用于可视化数据分布和离群值的统计图表。它展示了数据的中位数、四分位数、上下边界和离群值,可以帮助我们了解数据的集中趋势、离散程度和异常值情况。
箱型图的主要组成部分如下:
箱体(Box):由数据的四分位数(上四分位数和下四分位数)组成,箱体的长度表示数据的离散程度。
中位数线(Median):表示数据的中位数,即将数据从小到大排列后的中间值。
上边界(Upper Whisker)和下边界(Lower Whisker):表示数据的上四分位数和下四分位数之外的边界值。
离群值(Outliers):超过上边界和下边界的数据点,被认为是异常值。
箱型图的作用包括:
数据分布观察:箱型图可以帮助我们了解数据的分布情况,包括数据的中位数、四分位数、离散程度等。
离群值检测:箱型图可以帮助我们识别数据中的离群值,即与其他数据点相比较为异常的数值。
数据比较:通过绘制不同组数据的箱型图,可以直观地比较它们的中位数、四分位数和离散程度,从而了解它们之间的差异。
数据可视化:箱型图是一种简洁而有效的方式来展示数据的统计特征,可以用于报告和演示。
通过观察箱型图,我们可以获得关于数据集的重要信息,从而更好地理解和分析数据。

(1)简单箱型图

import matplotlib.pyplot as plt
import numpy as np
data1 = np.random.randn(100)
data2 = np.random.randn(100)
data3 = np.random.randn(100)
data = [data1, data2, data3]
labels = ['Group 1', 'Group 2', 'Group 3']
colors = [1, 0, 0.5]
plt.boxplot(data, labels=labels, vert=True, patch_artist=True, boxprops=dict(facecolor=colors))
plt.show()


(2)小提琴版箱型图

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

"""
font:设置中文
unicode_minus:显示负号
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号
"""
设置随机数生成器的种子,使每次生成的随机数相同方便后续的复现
"""
np.random.seed(19900108)
"""
生成随机数data
numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量
"""
data = np.random.normal(70, 40, 1000)
fig,axes=plt.subplots(1,2,figsize=(16,9))
#绘制箱型图
axes[0].boxplot(data)
axes[0].set_title("箱型图")
#绘制小提琴图
axes[1].violinplot(data,showmeans=True, showmedians=True)
axes[1].set_title("小提琴图")
plt.show()


(3)不同形状箱型图

import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
data = np.random.randn(100)
# 绘制带有缺口的箱线图
plt.boxplot(data, notch=True)
# 添加标签和标题
plt.xlabel('Data')
plt.ylabel('Values')
plt.title('Box Plot with Notch')
# 显示图表
plt.show()

import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
data = np.random.randn(100)
outliers = [2.5, -3.8, 3.2]  # 自定义异常值
# 绘制箱线图并自定义异常值样式
plt.boxplot(data, flierprops={'marker': 'x', 'markerfacecolor': 'red', 'markersize': 8, 'linestyle': 'none'},
            notch=True, showfliers=True)
# 添加自定义异常值
plt.scatter(np.full(len(outliers), 1), outliers, marker='x', color='red')
# 添加标签和标题
plt.xlabel('Data')
plt.ylabel('Values')
plt.title('Box Plot with Custom Outliers')
# 显示图表
plt.show()

import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
data = np.random.randn(100)
# 绘制箱线图并自定义箱子样式
plt.boxplot(data, boxprops={'color': 'green', 'linewidth': 2, 'linestyle': '--'},
            notch=True, showfliers=True)
# 添加标签和标题
plt.xlabel('Data')
plt.ylabel('Values')
plt.title('Box Plot with Custom Box Style')
# 显示图表
plt.show()

5、热力图的实现

简介:

热力图(Heatmap)是一种二维图表,通过使用颜色编码来表示数据的矩阵或表格中的值。热力图通常使用渐变色来展示数据的相对大小,较小的值使用较浅的颜色,较大的值使用较深的颜色。热力图可以直观地显示数据的分布和模式,帮助我们发现数据中的关联性和规律。
热力图的作用主要有以下几个方面:
可视化数据分布:热力图可以将数据的分布以直观的方式展示出来。通过观察颜色的变化,我们可以快速了解数据的整体分布情况,包括数据的集中程度、离散程度和梯度变化。
发现关联性和规律:热力图可以帮助我们发现数据中的关联性和规律。通过对比不同数据点之间的颜色差异,我们可以判断数据之间的相关性和趋势。例如,在生物学研究中,热力图可以用于显示基因表达水平的相关性。
强调重要信息:热力图可以突出显示数据中的重要信息。通过调整颜色映射和颜色条的设置,我们可以将感兴趣的数据区域或特定数值范围的数据突出显示,从而更加准确地传达数据的含义。
可视化矩阵数据:热力图特别适用于可视化矩阵或表格数据。通过将矩阵数据映射到热力图的颜色空间,我们可以更好地理解数据的结构和模式。
总之,热力图是一种直观、有效的数据可视化工具,可以帮助我们理解数据的分布、发现关联性和规律,并突出显示重要信息。它在各个领域的数据分析、探索和展示中都有广泛的应用。

(1)简单热力图

import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(10,6), dpi=100)
vegetables = ["cucumber", "tomato", "lettuce", "asparagus",
              "potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening",
           "Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]
harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
                    [2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
                    [1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
                    [0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
                    [0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
                    [1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
                    [0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])
plt.xticks(np.arange(len(farmers)), labels=farmers, 
                     rotation=45, rotation_mode="anchor", ha="right")
plt.yticks(np.arange(len(vegetables)), labels=vegetables)    
plt.title("Harvest of local farmers (in tons/year)")
for i in range(len(vegetables)):
    for j in range(len(farmers)):
        text = plt.text(j, i, harvest[i, j], ha="center", va="center", color="w")
plt.imshow(harvest)
plt.colorbar()
plt.tight_layout()
plt.show()


(2)热力图

from matplotlib import pyplot as plt
import numpy as np
def draw():
    # 定义热图的横纵坐标
    xLabel = ['0.1', '0.3', '0.5', '0.7', '0.9', '1']
    yLabel = ['0.001', '0.01', '0.1', '1']

    # 准备数据阶段
    data = np.array([[0.9095, 0.9187, 0.9205, 0.9264, 0.9261, 0.9127], [0.9130, 0.9106, 0.9240, 0.9322, 0.9285, 0.9138],
                     [0.8857, 0.8851, 0.8880, 0.8936, 0.8867, 0.9147],
                     [0.9181, 0.9217, 0.9308, 0.9355, 0.9377, 0.9104]])
    # 作图阶段
    fig, ax = plt.subplots(figsize=(10,6), dpi=100)
    # 定义横纵坐标的刻度
    ax.set_yticks(range(len(yLabel)))
    ax.set_yticklabels(yLabel)
    ax.set_xticks(range(len(xLabel)))
    ax.set_xticklabels(xLabel)
    # 作图并选择热图的颜色填充风格,这里选择yLGn
    im = ax.imshow(data, cmap="YlGn")
    # 增加右侧的颜色刻度条
    plt.colorbar(im)

    # 填充数字
    for i in range(len(yLabel)):
        for j in range(len(xLabel)):
            #print('data[{},{}]:{}'.format(i, j, data[i, j]))
            ax.text(j, i, data[i, j],
                    ha="center", va="center", color="black")
    # 增加标题
    plt.title("AUC values", fontdict={'size': 16})
    plt.xlabel(r'$\beta$', fontdict={'size': 16})
    plt.ylabel(r'$\gamma$', rotation=0, fontdict={'size': 16})
    # show
    fig.tight_layout()
    plt.show()
d = draw()

6、直方图的实现

简介:

直方图(Histogram)是一种用于展示数据分布的统计图表。它将数据划分为若干个等宽的区间(也称为“箱子”或“柱子”),并统计每个区间内数据的频数或频率。直方图通过绘制矩形条来表示每个区间内数据的数量或频率,矩形条的高度表示数据的频数或频率。
直方图的作用主要有以下几个方面:
描述数据分布:直方图可以直观地展示数据的分布情况。通过观察直方图的形状、峰度和偏态,我们可以了解数据的中心趋势、离散程度和数据的偏向性。
检测数据异常和离群值:直方图可以帮助我们检测数据中的异常值和离群值。异常值是指与其他观测值明显不同的极端数值。在直方图中,异常值通常表现为与其他柱子明显不同高度的柱子。
比较不同组的数据:通过将多个直方图放在一起,我们可以直观地比较不同组的数据分布情况。这对于探索不同类别或组之间的差异非常有用。
确定数据分布的特征:直方图可以帮助我们确定数据的分布特征,例如是否符合正态分布、是否存在多峰分布等。这对于选择适当的统计方法和模型具有重要意义。
数据预处理:直方图可以帮助我们进行数据预处理,例如确定数据的分箱方式、选择合适的数据转换方法等。
总之,直方图是一种简单而常用的数据可视化工具,可以帮助我们了解数据的分布特征、检测异常值和离群值,并进行数据比较和预处理。它在数据分析、探索和展示中被广泛应用。

(1)基础直方图

import matplotlib.pyplot as plt
import numpy as np
# 准备数据
data = np.random.randn(1000)
# 绘制直方图
plt.hist(data)
# 添加标签和标题
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram')
# 显示图表
plt.show()

(2)一图多形

import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 800)
data3 = np.random.normal(-2, 1, 1200)
# 绘制直方图
plt.hist(data1, bins=30, alpha=0.5, label='Data 1')
plt.hist(data2, bins=30, alpha=0.5, label='Data 2')
plt.hist(data3, bins=30, alpha=0.5, label='Data 3')
# 添加标签和标题
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram Comparison')
# 添加图例
plt.legend()
# 显示图表
plt.show()

(3)升级1

import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
data = np.random.randn(1000)
# 绘制直方图
plt.hist(data, bins=30, color='skyblue', edgecolor='black')
# 添加标签和标题
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram')
# 显示图表
plt.show()


(4)升级2

import numpy as np
import matplotlib.pyplot as plt
n_bins = 10
x = np.random.randn(1000, 3)
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(11,8))    #subplots创建多个子图
ax0=axes[0,0]
ax1=axes[0,1]
ax2=axes[1,0]
ax3=axes[1,1]
colors = ['red', 'tan', 'lime']
ax0.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
ax0.legend(prop={'size': 8})
ax0.set_title('bars with legend')
ax1.hist(x, n_bins, density=True, histtype='bar', stacked=True)
ax1.set_title('stacked bar')
ax2.hist(x, n_bins, histtype='step', stacked=True)
ax2.set_title('stack step (unfilled)')
x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
ax3.hist(x_multi, n_bins, histtype='bar')
ax3.set_title('different sample sizes')
fig.tight_layout()   #自动调整子图参数
plt.show()

7、3D线框图的实现

简介:

3D线框图(3D Wireframe Plot)是一种用于可视化三维数据的图表。它通过绘制三维空间中的线段来表示数据的分布和形状。3D线框图通常由一系列连接的线段组成,这些线段连接了数据点或数据的边界。
3D线框图的作用主要有以下几个方面:
展示数据的形状和结构:3D线框图可以直观地展示数据的形状和结构。通过观察线段的分布和连接方式,我们可以了解数据在三维空间中的分布和形态。
比较不同组的数据:通过将多个3D线框图放在一起,我们可以比较不同组数据的形状和结构。这对于探索不同类别或组之间的差异非常有用。
可视化复杂关系:3D线框图可以用于可视化复杂的关系和模式。通过绘制多个线段和连接点,我们可以展示数据中的复杂关系,例如多个变量之间的相互作用。
辅助数据分析和决策:3D线框图可以帮助我们进行数据分析和决策。通过观察线段的长度、角度和形状,我们可以得到关于数据的直观感受,并从中提取有用的信息。
艺术和设计应用:3D线框图在艺术和设计领域也有广泛的应用。它可以用于创造具有立体感和空间感的图像和模型,为艺术作品和设计方案增添视觉效果。
总之,3D线框图是一种用于可视化三维数据的图表,可以展示数据的形状和结构,比较不同组的数据,可视化复杂关系,并辅助数据分析和决策。它在数据分析、科学研究、艺术和设计等领域都有广泛的应用。

(1)3D线框图

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# 生成数据
x = np.linspace(-5, 5, 50)  # x轴坐标
y = np.linspace(-5, 5, 50)  # y轴坐标
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))  # z轴坐标,这里使用sin函数生成一个曲面
# 创建一个三维坐标系
fig = plt.figure(figsize=(10,6), dpi=100)
ax = fig.add_subplot(111, projection='3d')
# 绘制线框图
ax.plot_wireframe(X, Y, Z)
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()


(2)3D散点图

import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.random.rand(100)  # x轴数据
y = np.random.rand(100)  # y轴数据
z = np.random.rand(100)  # z轴数据
colors = np.random.rand(100)  # 颜色数据
# 创建3D图形对象
fig = plt.figure(figsize=(10,6), dpi=100)
ax = fig.add_subplot(111, projection='3d')
# 绘制3D散点图
ax.scatter(x, y, z, c=colors, cmap='viridis', marker='o')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()


(3)3D条形图

import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.arange(3)  # x轴位置
y = np.arange(3)  # y轴位置
x_mesh, y_mesh = np.meshgrid(x, y)  # 创建网格
z = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  # 条形的高度
# 创建3D图形对象
fig = plt.figure(figsize=(10,6), dpi=100)
ax = fig.add_subplot(111, projection='3d')
# 绘制3D条形图
ax.bar3d(x_mesh.flatten(), y_mesh.flatten(), np.zeros_like(z).flatten(), 0.5, 0.5, z.flatten())
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()


(4)3D曲面图

import matplotlib.pyplot as plt
import numpy as np
 
# 数据准备
x = np.linspace(-5, 5, 100)  # x轴数据范围
y = np.linspace(-5, 5, 100)  # y轴数据范围
x_mesh, y_mesh = np.meshgrid(x, y)  # 创建网格
z = np.sin(np.sqrt(x_mesh**2 + y_mesh**2))  # 曲面高度
# 创建3D图形对象
fig = plt.figure(figsize=(10,6), dpi=100)
ax = fig.add_subplot(111, projection='3d')
# 绘制3D曲面图
ax.plot_surface(x_mesh, y_mesh, z, cmap='viridis')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()


(5)3D等高线图

import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.linspace(-5, 5, 100)  # x轴数据范围
y = np.linspace(-5, 5, 100)  # y轴数据范围
x_mesh, y_mesh = np.meshgrid(x, y)  # 创建网格
z = np.sin(np.sqrt(x_mesh**2 + y_mesh**2))  # 曲面高度
# 创建3D图形对象
fig = plt.figure(figsize=(10,6), dpi=100)
ax = fig.add_subplot(111, projection='3d')
# 绘制3D等高线图
ax.contour3D(x_mesh, y_mesh, z, 50, cmap='viridis')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()


以上就是matplotlib的一些简单用法,大家可以参考一下,因为实现方法和实现的图形类型多种多样,这里列举远远不够,简单供大家参考!

物联沃分享整理
物联沃-IOTWORD物联网 » Python五种方式实现可视化,包括动态图表展示(matplotlib、seaborn、plotly、bokeh、pyecharts)——matplotlib传记

发表评论