python 中 matplotlib 使用详解

文章目录

  • 1、原理
    • 最简单的方法 创建分析图
  • 2、 画布(Figure) 和 坐标系(Axes)属性设置
    • 2.1 画布
    • 2.2 坐标系属性设置
      • 字体属性设置
      • 坐标系属性设置
        • 设置坐标系的标题:
        • 设置坐标轴的名称:
        • 设置坐标轴的刻度值:
        • 移动和隐藏坐标轴:
  • 3、创建坐标系
    • 3.1、plt.subplot() 和 fig.add_subplot()区别
    • 3.2、 用 plt.subplots()生成画布和坐标系
    • 3.3、 用 add_gridspec()对坐标系进行布局。
  • 4、一些视图的画法
    • 4.1、 折线图
      • 线型、点型、颜色
    • 4.2 柱状图
      • 4.2.1 垂直柱状图
      • 4.2.2 水平柱状图
    • 4.3 散点图
    • 4.4 饼状图
    • 4.5 直方图

1、原理

matplotlib 总的来说由个“元素”组成:
画  布: Figure
坐标系: Axes
图  形: Line2D

生成可视化视图前,至少要有一张“画布”和一个“坐标系”。
下图中红色框为“画布”, 黄色线表示画布分割出来的4个“坐标系”,
每个坐标系中可以画多个分析图,如第二个坐标系中画的 红、蓝 两根线。
python 中 matplotlib 使用详解_第1张图片
流程步骤:

  1. 用 figure 方法生成画布。
  2. 往画布中添加坐标系。
  3. 在坐标系中生成数据图。
    python 中 matplotlib 使用详解_第2张图片

最简单的方法 创建分析图

import matplotlib.pyplot as plt

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

plt.plot(data)   # 传入一个数据序列。其中x轴的坐标自动生成,从 0 开始。

plt.show()       # 把图片显示出来。
print(111111)   

plt.plot( ) 方法会自动的创建一张画布和一个坐标系,然后在里面生成分析图。
小提示:上面代码中的 print(111111) 是不会运行的。因为调用了plt.show(),它会保持画布一直显示,进入了一个loop循环中。
python 中 matplotlib 使用详解_第3张图片

2、 画布(Figure) 和 坐标系(Axes)属性设置

2.1 画布

创建画布时设置属性:

import matplotlib.pyplot as plt

fig = plt.figure(num='画布名称',           # 设置画布的名称,默认为 1。
                 figsize=[6.4, 4.8],      # 画布尺寸,默认1英寸含100个像素,所以这里表示640x480像素大小的图片。
                 dpi=150,                 # 每英寸的像素,即分辨率。
                 facecolor='lightblue',   # 画布背景色。默认 白色
                 edgecolor='red',         # 画布边框颜色。默认 白色
                    )

也可以用 fig 的 set() 方法,随时设置画布的属性,
plt.gcf() 获取当前的画布,如:

fig = plt.gcf()
fig.set(facecolor='red')

调整画布中各坐标系的布局:

fig.subplots_adjust(left=0.1,     # 调整最左边坐标系到画布左边框的间距(参数 0~1)
                    right=0.9,    # 调整最右边坐标系到画布右边框的间距(参数 0~1)
                    top=0.9,      # 调整最上面坐标系到画布顶部框的间距(参数 0~1)
                    bottom=0.1,   # 调整最下面坐标系到画布底部框的间距(参数 0~1)
                    wspace=0.8,   # 调整坐标系之间的水平间隔
                    hspace=0.6,   # 调整坐标系之间的垂直间隔
                    )


# 自动调整坐标系的布局,使它们之间的内容(坐标轴名称)不重叠。这个方法是在所有坐标系布局好之后,再用的。
fig.tight_layout()  

2.2 坐标系属性设置

坐标系属性设置有两种情况,它们的设置方式有些许不同,
一种是 直接用 plt.plot() 自动生成的坐标系,另一种是手动创建的坐标系

字体属性设置

首选用下面的 全局字体自定义字体方法2 两个方法。

查看matplotlib中所有可用的字体

import matplotlib.pyplot as plt
import matplotlib.font_manager as fontmg
import random

font_list = fontmg.fontManager.ttflist
font_name_list = [i.name for i in font_list]
#print(font_name_list)

自定义全局字体

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimSun']    # 指定默认字体为新宋体。
plt.rcParams['axes.unicode_minus'] = False      # 解决保存图像时 负号'-' 显示为方块和报错的问题。

自定义局部字体 方法 2

import matplotlib.pyplot as plt
import matplotlib.font_manager as fontmg

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.plot(x, label='小示例图标签')

# 直接用字体的名字。
plt.xlabel('x 轴名称参数', fontproperties='Microsoft YaHei', fontsize=16)         # 设置x轴名称
plt.ylabel('y 轴名称参数', fontproperties='Microsoft YaHei', fontsize=14)         # 设置Y轴名称
plt.title('坐标系的标题',  fontproperties='Microsoft YaHei', fontsize=20)		  # 设置坐标系标题的字体
plt.legend(loc='lower right', prop={"family": 'Microsoft YaHei'}, fontsize=10)    # 小示例图的字体设置

自定义 局部字体 方法3

import matplotlib.pyplot as plt
import matplotlib.font_manager as fontmg

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.plot(x, label='小示例图标签')

my_font1 = fontmg.FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf')      # 读取系统中的 黑体 字体。
my_font2 = fontmg.FontProperties(fname=r'C:\Windows\Fonts\simkai.ttf')      # 读取系统中的 楷体 字体。

plt.xlabel('x 轴名称参数', fontproperties=my_font1, fontsize=16)       # 设置x轴名称
plt.ylabel('y 轴名称参数', fontproperties=my_font1, fontsize=14)       # 设置Y轴名称
plt.title('坐标系的标题',  fontproperties=my_font2, fontsize=20)       # 标题的字体设置
plt.legend(loc='lower right', prop=my_font1, fontsize=10)              # 小示例图的字体设置

坐标系属性设置

设置坐标系的标题:

import matplotlib.pyplot as plt

plt.title('坐标系标题',                         # 设置坐标系的标题。
          loc='center',                      # 设置标题的方位 'center','right','left'
          pad=10,                            # 设置标题离坐标系的距离。
          fontproperties='Microsoft YaHei',  # 设置字体为微软雅黑。
          fontsize=20)                       # 设置字体的大小。

由subplot(),add_subplot(),subplots()手动实例化出来的坐标系设置标题,就是在title之前加set,如:

axe1 = fig1.add_subplot(2, 2, 1)
# axe1 = plt.subplot(222)

# 在title之前加set
axe1.set_title('坐标系标题',                        # 设置坐标系的标题。
          	    loc='center',                      # 设置标题的方位 'center','right','left'
          		pad=10,                            # 设置标题离坐标系的距离。
          		fontproperties='Microsoft YaHei',  # 设置字体为微软雅黑。
          		fontsize=20)   

设置坐标轴的名称:

import matplotlib.pyplot as plt

plt.xlabel('x 轴名称',                         # 设置x轴名称
           labelpad=10,                        # 设置轴名称离x轴的距离。默认为 None
           rotation=30,                        # 设置字体的旋转角度。
           fontproperties='Microsoft YaHei',   # 设置字体为微软雅黑。
           fontsize=16)                        # 设置字体的大小

# y 轴为:
plt.ylabel(.......)

手动实例化出来的坐标系设置轴名称也是在对应命令前加set,如下:

import matplotlib.pyplot as plt

axe.set_xlabel('x 轴名称',                         # 设置x轴名称
           	   labelpad=10,                        # 设置轴名称离x轴的距离。默认为 None
               rotation=30,                        # 设置字体的旋转角度。
               fontproperties='Microsoft YaHei',   # 设置字体为微软雅黑。
               fontsize=16)                        # 设置字体的大小

# y 轴为:
axe.set_ylabel(.......)

也可以用 set() 方法,把 坐标系的标题和坐标轴的名称一起设置,如下:

axe.set(xlabel='x 轴名称',            # 设置x轴标签。
        ylabel='y 轴名称',            # 设置y轴标签。
        title='坐标系标题',)          # 设置该坐标系的标题名称

设置坐标轴的刻度值:

import matplotlib.pyplot as plt

# 设定传入的x轴的数据,这里传入的是 1 到 10 的是个数据。
x_data = [i for i in range(1, 11)]

# 设定传入y轴的数据,这里传入的是 10 个 10 ~ 99 的随机整数。
y_data = [random.randint(10, 100) for i in range(10)]

y_data = [random.randint(10,100) for i in range(10)]

plt.plot(x_data,  y_data)   # 绘制曲线图。

# ============ 设置 x, y 轴的刻度的数值范围 =====================
plt.xlim([0, 12])       	 # x 轴的刻度值范围为 0 到 12。
plt.ylim([0, 100])      	 # y 轴的刻度值范围为 0 到 11。
# plt.axis([0,12, 0,100])    # 可以把 x, y 一起设置。

# 设置 x, y 轴的需要显示出来的刻度。
# 如果不设置这个,那么显示出来的刻度就是上面设置的刻度数值范围。
plt.xticks(list(range(1, 11)))   # x 轴只显示出 1 到 10 的刻度值,0 和 12 刻度不显示(但它们还是存在坐标轴中)

# y 轴只显示[60,80,90]三个刻度,且把它们刻度值替换成['及格', '良好', '优秀']
plt.yticks([60, 80, 90], ['及格', '良好', '优秀'], rotation=30)      # rotation 旋转刻度的文字。

手动实例化出来的坐标系刻度值设置:

axe.set_xlim([0, 10])                  # 设置 x 轴刻度值的范围。

axe.set_xticks([0, 2, 4, 6, 8, 10])    # 自定义哪些刻度值显示出来。

axe.set_xticklabels(['zero', 'two', 'four', 'six', 'eight', 'ten'],    # 把刻度值换成对应的文字。
                    rotation=30,                                       # 字体旋转30度角
                    fontsize='medium')                                 # 字体大小(...small, medium, large...),也可以用数字。
# y 轴,就是把命令改成对应的y……

移动和隐藏坐标轴:

每生成一个坐标系,它是有四条坐标轴的,也就是坐标系的外方框。
默认的刻度值是显示在左边和底部的坐标轴上的。
plt.gca() 获取当前坐标系

# 用 gca() 函数获取当前的坐标系,来对坐标轴进行详细设置。
axe = plt.gca()

# ========== 设置刻度值在哪条坐标轴上显示 ===================
axe.xaxis.set_ticks_position('bottom')    # 设置x轴,其他参数有:'top', 'both', 'default', 'none'
axe.yaxis.set_ticks_position('left')      # 设置y轴,其他参数有:'right', 'both', 'default', 'none'

# ========== 设置坐标轴的颜色 ===================
axe.spines['right'].set_color(None)      # 设置右边坐标轴的颜色为None(即不显示坐标轴)
axe.spines['top'].set_color('red')       # 设置顶部坐标轴的颜色为红色。

# ========== 设置坐标轴的位置 ===================
""" 参数'data'表示按刻度值放置,所以还需传入一个刻度值的参数。
    参数 'center'表示放置在中间位置,等同于('data', 0.5),
    参数 'zero' 表示放置在起始位置, 等同于('data', 0.0) """
axe.spines['bottom'].set_position(('data', 6))      # 把底部的轴放在刻度值为6的位置。
# axe.spines['bottom'].set_position('center')        # 把底部的轴放置在中间。(‘center’只需要一个参数即可)

# ========== 是否在坐标系中显示 网格 ===================
axe.grid(True)    # True为显示,默认 False。

3、创建坐标系

3.1、plt.subplot() 和 fig.add_subplot()区别

plt.subplot() :在当前的画布中创建坐标系。

fig.add_subplot():在画布fig中创建坐标系(个人比较喜欢用这个方法创建,比较容易控制)。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimSun']    # 指定默认字体为新宋体。
plt.rcParams['axes.unicode_minus'] = False

fig1 = plt.figure('第一块画布', figsize=[6.4, 4.8], dpi=100)    # 第一个参数设置画布框的名字,即边框左上角的文字,默认数字1开始。
fig2 = plt.figure('第二块画布', figsize=(8, 6), dpi=100)        # figsize 以英尺为单位的宽高值(一英尺=2.54cm),默认一英尺有100个像素点(dpi)。

# 定义从-pi到pi之间的数据,平均取64个数据点
x_data = np.linspace(-np.pi, np.pi, 64, endpoint=True)  

"""===================== add_subplot() =================================
	用 fig1.add_subplot()方法在画布fig1中添加一个坐标系,
    前面两个参数表示:将整个 fig1 分成两行、两列,
    第三个参数表示该坐标系放在第1个网格"""
ax1 = fig1.add_subplot(2, 2, 1)
# 绘制正弦曲线
ax1.plot(x_data, np.sin(x_data))         # 在ax1坐标系中画图。
ax1.grid(True)                           # 用ax1中的gird方法添加网格线。

ax1.spines['right'].set_color('none')    # 设置坐标轴的一些属性。
ax1.spines['top'].set_color('none')
ax1.spines['bottom'].set_position(('data', 0))
ax1.spines['left'].set_position(('data', 0))
ax1.set_title('正弦曲线',fontproperties='Microsoft YaHei')     # 单独坐标系得用 set_title()方法了。


"""===================== subplot() =================================
   plt.subplot 会自动在当前激活的 figure 中添加坐标系,之后的plt操作都会在该坐标系中进行。
   代码中 fig2 是在 fig1 之后创建的,所以当前 激活的figure 就是fig2, 因此ax2会被放在fig2中"""
ax2 = plt.subplot(222)
print('ax2当前活动的画布为:', plt.gcf())
print('ax2当前活动的坐标系为:', plt.gca())
# 绘制余弦曲线
# plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。
# plt.gca().plot(x_data, np.cos(x_data))                # 即这行代码和下面绘制图形的代码效果是等同的。
plt.plot(x_data, np.cos(x_data))

plt.gca().spines['right'].set_color('none')             # plt.gca()获取当前激活画布中的坐标系,就是ax2
ax2.spines['top'].set_color('none')                     # 所以这里即可以用 ax2,也可以用plt.gca()。
plt.gca().spines['bottom'].set_position(('data', 0))
plt.gca().spines['left'].set_position(('data', 0))
ax2.set_title('余弦曲线',loc='left')                      # 所以这里可以用plt.title()方法。


"""重新把 ax3 坐标系放到第一块画布,
   因为 fig1.add_subplot 不会激活fig1画布,它只是在fig1中再生成一个坐标系。
   所以当前激活的画布还是 fig2。"""
ax3 = fig1.add_subplot(223)
print('ax3当前活动的画布为:',plt.gcf())            # 这里获取的和 ax2 中是一样的。
print('ax3当前活动的坐标系为:', plt.gca())
# 绘制正切曲线
ax3.plot(x_data, np.tan(x_data))
plt.grid(True)                               # 用 plt 中的gird方法添加网格线。它会把网格添加到 ax2 中。
plt.gca().spines['right'].set_color('red')   # 所以这里用 plt.gca(),它只会在fig2中生效, 即它会把 ax2 中的有边界改为红色。
ax3.spines['top'].set_color('green')
ax3.spines['bottom'].set_position(('data', 0))
ax3.spines['left'].set_position(('data', 0))
ax3.set_title('正切曲线')

fig1.savefig('my_chart1.png')        # 保存画布fig1生成的图片。
plt.savefig('my_chart2.png')         # 保存当前激活画布生成的图片,即 fig2。
plt.show()

python 中 matplotlib 使用详解_第4张图片

3.2、 用 plt.subplots()生成画布和坐标系

import matplotlib.pyplot as plt
import numpy as np

# 画图的数据
x = np.linspace(0, 10, 200)
data_obj = {'x': x,
            'y1': 2 * x + 1,
            'y2': 3 * x + 1.2,
            'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}

"""subplots 生成子坐标系。
plt.subplots(n, m) 会返回两个对象,一个画布和对应的坐标系列表。
(传入的参数表示 生成 n行、m列的坐标系组)。
"""
fig, ax = plt.subplots(2, 2)      # 获取生成的画布和坐标系组。
print(fig, '\n', ax)

# 设置画布的属性:各坐标系的间距。
fig.subplots_adjust(left=0.1,     # 调整最左边坐标系到画布左边框的间距(参数 0~1)
                    right=0.9,    # 调整最右边坐标系到画布右边框的间距(参数 0~1)
                    top=0.9,      # 调整最上面坐标系到画布顶部框的间距(参数 0~1)
                    bottom=0.1,   # 调整最下面坐标系到画布底部框的间距(参数 0~1)
                    wspace=0.8,   # 调整坐标系之间的水平间隔
                    hspace=0.6,   # 调整坐标系之间的垂直间隔
                    )

# fig.tight_layout()  # 自动调整布局,使标题之间不重叠

# 在 ax[0, 1] 坐标系中(即第一行第二列的坐标系)画两条线,并填充两条线之间的颜色。
ax[0, 1].fill_between(data_obj['x'],         # 从字典中读取数据。
                      data_obj['y1'],
                      data_obj['y2'],
                      color='yellow')

# 在两条线之间再画一曲条线。
ax[0, 1].plot('x', 'mean',            # 通过 data_obj 字典的键获取参数值。
              color='black',          # 通过 data_obj 字典的键获取参数值。
              data=data_obj,          # 传入 data_obj 字典(这是另外一种传数据参数的方式。)
              label='aaaaa')          # 图例名称。

# 设置对应坐标系的属性
ax[0, 1].set(ylabel='Temperature (deg C)',    # 设置y轴标签。
             xlabel='Time',                   # 设置x轴标签。
             title='A tale of two cities',)    # 设置该坐标系的标题名称

ax[0, 1].legend(loc=4)          # 设置图例

print(ax[0, 1].get_xlim())      # 获取 x 轴坐标值的显示范围。
ax[0, 1].set_xlim([0, 10])      # 设置 x 轴坐标值的显示范围。

ax[0, 1].set_xticks([0, 2, 4, 6, 8, 10])    # 自定义哪些坐标显示出来。

ax[0, 1].set_xticklabels(['zero', 'two', 'four', 'six', 'eight', 'ten'],    # 把坐标换成对应的文字。
                         rotation=30,                                        # 字体旋转30度角
                         fontsize='medium')                    # 字体大小(...small, medium, large...)。
       
plt.show()

python 中 matplotlib 使用详解_第5张图片

3.3、 用 add_gridspec()对坐标系进行布局。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimSun']  # 指定默认字体为新宋体。
plt.rcParams['axes.unicode_minus'] = False

# 定义从-pi到pi之间的数据,平均取64个数据点
x_data = np.linspace(-np.pi, np.pi, 64, endpoint=True)

Fig = plt.figure()  # 创建一块画布,画布名字大小均默认。

# ======================== 第一步 ================================
# 将画布 Fig 分割成两行、两列的空间。
gs = Fig.add_gridspec(2, 2)

# ======================== 第二步 ================================
# 指定在某个空间中生成坐标系。
# gs[0, 0:2] 索引参数,0表示第一行,0:2 表示 第0列到第2列(不包括第2列)。
ax1 = Fig.add_subplot(gs[0, 0:2])  # 也可以这样子 gs[0, :],代表第一行整行。

ax1.plot(x_data, np.tan(x_data))
ax1.spines['right'].set_color('none')
ax1.spines['top'].set_color('none')
ax1.spines['bottom'].set_position(('data', 0))
ax1.spines['left'].set_position(('data', 0))
ax1.set_title('正切曲线')

# 指定在第2行,第1列绘制。
ax2 = Fig.add_subplot(gs[1, 0])

ax2.plot(x_data, np.sin(x_data))
ax2.spines['right'].set_color('none')
ax2.spines['top'].set_color('none')
ax2.spines['bottom'].set_position(('data', 0))
ax2.spines['left'].set_position(('data', 0))
ax2.set_title('正弦曲线')

# 指定在第2行,第2列绘制。
ax3 = Fig.add_subplot(gs[1, 1])

ax3.plot(x_data, np.cos(x_data))
ax3.spines['right'].set_color('none')
ax3.spines['top'].set_color('none')
ax3.spines['bottom'].set_position(('data', 0))
ax3.spines['left'].set_position(('data', 0))
ax3.set_title('余弦曲线')

plt.show()

python 中 matplotlib 使用详解_第6张图片

4、一些视图的画法

4.1、 折线图

import matplotlib.pyplot as plt
import random

# 修改全局字体。
plt.rcParams['font.sans-serif'] = ['simsun']

x_data = [i for i in range(10)]
y_data = [random.randint(10,100) for i in range(10)]

x_data2 = [i for i in range(1,10)]
y_data2 = [random.randint(10,100) for i in range(9)]


"""plt.plot()绘制图形后,返回的结果是一个包涵绘制图形对象的列表。
    这里只画了一条线,所以只要用一个 解包 的方法就能获取该线条。"""
ln1, = plt.plot(x_data,  y_data,         # x, y 坐标
                color='red',             # 线条颜色
                linewidth = 2,           # 线条粗细
                linestyle='dotted',      # 线条类型。'solid', 'dashed', 'dashdot'
                label='年级1'             # 对应图例的名称。
                      )

ln2, = plt.plot(x_data2,  y_data2,
                'b-.',                   #  另外一种设置线形的方法, b 颜色, -.线型。
                label='年级2')
plt.legend(loc='lower right')

""" plot()可以一次性画多条线,所以也可以这样。 """
# ln1, ln2 = plt.plot(x_data,  y_data, x_data2,  y_data2)
# ln1.set(color='red', linewidth = 2, linestyle='dotted',label='年级1')
# ln2.set(color='blue', linewidth = 1, linestyle='-.',label='年级2')
# plt.legend(loc='lower right')

plt.xlabel('年份')       # 设置x轴名称
plt.ylabel('成绩')       # 设置Y轴名称

plt.title('历年成绩', fontsize=20)    # 设置标题名称

# 把 y 轴的标签由数值改为对应的字符串。
plt.yticks([60, 80, 90], ['及格', '良好', '优秀'])

# 设置x, y 轴的数值范围。前面两个数为 x轴的最小和最大值,……。
plt.axis([0,11, 0,100])

plt.show()

线型、点型、颜色

python 中 matplotlib 使用详解_第7张图片

4.2 柱状图

4.2.1 垂直柱状图

import numpy as np
import matplotlib.pyplot as plt


plt.rcParams['font.sans-serif'] = ['simsun']    # 设置全局字体
plt.rcParams['axes.unicode_minus'] = False 

# 随机生成5个 [10 , 81) 之间的整数
# data = np.random.randint(10, 81, 5)
# print(list(data))
y_data = [26, 59, 85, 70, 28]
y_data2 = [50, 47, 78, 11, 63]

x_data = list(range(1, 6))
x_data1 = np.array(x_data) - 0.2
x_data2 = np.array(x_data) + 0.2

# 画柱状图
plt.bar(x_data1, y_data,
        color='red',             # 颜色
        bottom=None,             # y轴, 坐标的起始值(终止值为 bottom值加数据值),参考下面的水平柱状图。
        align='center'			 # 柱状图与坐标的对齐方式。
        width=0.4)               # 柱子的宽度。

# 再画一个柱状图,得控制好x轴的位置,防止重叠。
plt.bar(x_data2, y_data2,
        width=0.4)


# 在柱状图的顶部插入文字
for x, y in enumerate(y_data, start=1):
    plt.text(x-0.2, y+2, f'值:{y}', ha='center', va='bottom',
             bbox={'facecolor': 'yellow', 'alpha': 0.2})

for x, y in enumerate(y_data2, start=1):
    plt.text(x+0.2, y+2, f'值:{y}', ha='center', va='bottom',
             bbox={'facecolor': 'yellow', 'alpha': 0.2})

plt.show()

python 中 matplotlib 使用详解_第8张图片

4.2.2 水平柱状图

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['simsun']    # 设置全局字体
plt.rcParams['axes.unicode_minus'] = False 

# 随机生成5个 [10 , 81) 之间的整数
# data = np.random.randint(10, 81, 5)
# print(list(data))

y_data = list(range(1,6))
data = [26, 59, 85, 70, 28]


plt.barh(y=y_data,           # y 轴坐标 
         width=data,         # x 轴坐标
         height=0.5,         # 柱子的宽度。
         color='steelblue',
         left=10,            # x轴, 坐标的起始值(如: 源数据值为70, 那柱状图就会从10到80),。
         align='center',     # 柱子的对齐方式, 'center':柱子中间对齐y坐标。
         )
 
plt.show()

python 中 matplotlib 使用详解_第9张图片

4.3 散点图

import matplotlib.pyplot as plt
import numpy as np


plt.rcParams['font.sans-serif'] = ['SimSun']    # 指定默认字体为新宋体。
plt.rcParams['axes.unicode_minus'] = False      # 解决保存图像时 负号'-' 显示为方块和报错的问题。

# 定义从-pi到pi之间的数据,平均取64个数据点
x_data = np.linspace(-np.pi, np.pi, 64)

# 将整个figure分成两行两列,第三个参数表示该图形放在第1个网格
# 沿着正弦曲线绘制散点图
plt.scatter(x_data, np.sin(x_data),
            c='purple',                       # 设置点的颜色
            s=50,                             # 设置点半径
            alpha=0.5,                        # 设置透明度
            marker='p',                       # 设置使用五边形标记
            linewidths=1,                     # 设置边框的线宽
            edgecolors=['green', 'yellow'])   # 设置边框的颜色,绿色、黄色间隔

# plt.scatter(x_data, np.sin(x_data), cmap=plt.get_cmap('rainbow'), )  # cmap也可以设置点的颜色

# 绘制第二个散点图(只包含一个起点),突出起点
plt.scatter(x_data[0], np.sin(x_data)[0],
            c='red',     # 设置点的颜色
            s=150,       # 设置点半径
            alpha=1)     # 设置透明度

# 绘制第三个散点图(只包含一个结束点),突出结束点
plt.scatter(x_data[63], np.sin(x_data)[63],
            c='black',    # 设置点的颜色
            s=150,        # 设置点半径
            alpha=1)      # 设置透明度

plt.gca().spines['right'].set_color('none')
plt.gca().spines['top'].set_color('none')
plt.gca().spines['bottom'].set_position(('data', 0))
plt.gca().spines['left'].set_position(('data', 0))
plt.title('正弦曲线的散点图')
plt.show()

python 中 matplotlib 使用详解_第10张图片

4.4 饼状图

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['simsun']  # 设置全局字体
plt.rcParams['axes.unicode_minus'] = False

# 随机生成5个 [10 , 81) 之间的整数
# data = np.random.randint(10, 81, 5)
data = [26, 59, 79, 75, 28]

labels = ['a', 'b', 'c', 'd', 'e']  # 定义各数据对应的标签内容。
explode = [0, 0.1, 0, 0, 0]
colors = ['red', 'pink', 'magenta', 'purple', 'orange']

# print(help(plt.pie))
plt.pie(x=data,  # 数据源
        labels=labels,              # 数据源对应的标签
        labeldistance=1.2,          # 设置标签与圆心的距离(1刚好位于半径处)
        colors=colors,              # 设置饼图的自定义填充色。
        shadow=True,                # 是否添加阴影。
        explode=explode,            # 突出显示。值为0~1,表示剥离开的距离。
        autopct='%.3f%%',           # 显示各项的百分比,.3f 保留3位小数。
        pctdistance=0.7,            # 设置 百分比标签 与圆心的距离
        startangle=90,              # 设置饼图的初始角度。逆时针旋转90度。
        counterclock=False,         # 是否为逆时针,这里设为False 则表示为顺时针。
        center=(0.5, 0.5),          # 设置饼图的圆心坐标位置, 默认(0,0)。
        radius=0.4,                 # 设置饼图的半径.
        textprops={'fontsize': 16,
                   'color': 'black'},  # 设置文本的属性。
        wedgeprops={'linewidth': 2,
                    'edgecolor': 'green'},  # 设置饼图内外边界的属性值

        frame=True)  # 是否显示画布的外框。

# plt.xlim([0,10])        # 可自定义坐标值,那么上面的 圆心和半径值得重新设置。
plt.title('饼图')

plt.show()

python 中 matplotlib 使用详解_第11张图片

4.5 直方图

直方图可以用做样本分布统计,它由竖立在x轴上的多个相邻的矩形组成,
每个矩形的高度跟落在其所对应的x轴中的元素数量成正比。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['simsun']  # 设置全局字体
plt.rcParams['axes.unicode_minus'] = False

# data = np.random.randint(1, 101, 100)
# print(list(data))
data = [10, 8, 39, 49, 14, 51, 3, 71, 78, 46, 54, 53, 45, 51, 39, 81, 62,
        63, 79, 2, 35, 22, 57, 69, 89, 39, 63, 85, 72, 22, 53, 31, 48, 50,
        5, 74, 38, 55, 73, 88, 18, 42, 79, 69, 1, 87, 65, 8, 46, 65, 16,
        12, 38, 34, 39, 72, 51, 65, 91, 62, 53, 69, 66, 89, 39, 8, 54, 3,
        28, 51, 75, 3, 43, 95, 15, 27, 99, 45, 29, 64, 63, 34, 79, 63, 35,
        39, 62, 97, 89, 85, 18, 19, 87, 57, 79, 45, 95, 96, 28, 93]

print(len(np.where((np.array(data) > 65) & (np.array(data) <= 70))[0]))

# hist() 函数返回三个数据。
# n 为 处于 bins 值范围内的数据的个数。
n, bins, patches = plt.hist(data,       # 数据源
                            bins=20)    # 把数据源切分成20份。

plt.grid(True)
plt.xticks([i for i in range(0, 101, 10)])
plt.xlim([0, 100])

print(n, bins, patches)

plt.show()

python 中 matplotlib 使用详解_第12张图片

你可能感兴趣的:(python知识点整理)