绘制简单图形
import numpy as np
import matplotlib.pyplot as plt
# 解决中文显示问题
font = {'family' : 'SimHei', 'size' : '20'}
plt.rc('font', **font)
# 解决数字中负号显示问题
plt.rcParams['axes.unicode_minus'] = False
# 定义横坐标。生成 [-5, 5] 区间的 100 个点
x = np.linspace(-5, 5, 100)
# 定义纵坐标
y1 = -2 * x + 1
# 定义画布大小。(宽, 高)
plt.figure(figsize=(8, 5))
# 绘制图形
plt.plot(x, y1)
如果只要显示坐标轴的一部分,可以限制坐标轴的显示范围。
# 限制 x 轴的显示范围。可以显示坐标的一部分
plt.xlim((-2, 2))
# 限制 y 轴的显示范围
plt.ylim((-5, 5))
在绘制之前加入上述代码,可得如下图形。
定义坐标轴标签。
plt.xlabel('x轴')
plt.ylabel('y轴')
修改刻度显示。
plt.yticks([-7, -5, 0, 3, 8], ['北京', '天津', '河北', '东北', '山东'])
设置边框颜色。
# 设置边框的颜色。可以设置 top,bottom,left,right
ax = plt.gca()
ax.spines['left'].set_color('red')
不显示某条边框。
# 不设置颜色
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
移动轴,使轴成为十字形。
ax = plt.gca()
# 隐藏顶部和右部
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 将 x 轴作为坐标轴的底部
ax.xaxis.set_ticks_position('bottom')
# 将坐标轴底部的相对位置设为 0
ax.spines['bottom'].set_position(('data', 0))
# 将 y 轴作为坐标轴的左部
ax.yaxis.set_ticks_position('left')
# 将坐标轴左部的相对位置设为 0
ax.spines['left'].set_position(('data', 0))
显示图例。
plt.plot(x, y1, label='y = -2*x+1')
# 以最佳的位置显示图例
plt.legend(loc='best')
legend 的 loc 参数详细设置如下(loc 可传入 string,也可传入 code)。
在图中显示一段说明文字。
# 添加说明。参数含义分别为 x轴位置,y轴位置,说明文字,fontdict 字体设置
plt.text(1, 5, '这是一段说明', fontdict={'size': 16, 'color': 'r'})
绘制统计图形
柱状图
import numpy as np
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [6, 10, 4, 5, 1]
plt.bar(
# 柱体的标签值
x,
# 柱体的高度
y,
# align,设置柱体的相对 x 轴刻度的对齐方式。可选项:edge, center
align='center',
# 颜色
color='b',
# tick_label 刻度的值,用于替换刻度的显示
tick_label=['A', 'B', 'C', 'D', 'E'],
# 透明度,设置范围:[0, 1],越趋近于 0,越透明
alpha=0.2
)
条形图
import numpy as np
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [6, 10, 4, 5, 1]
plt.barh(
# 柱体的标签值
x,
# 柱体的高度
y,
# align,设置柱体的相对 x 轴刻度的对齐方式。可选项:edge, center
align='center',
# 颜色
color='b',
# tick_label 刻度的值,用于替换刻度的显示
tick_label=['A', 'B', 'C', 'D', 'E'],
# 透明度,设置范围:[0, 1],越趋近于 0,越透明
alpha=0.2
)
条形图的参数与柱形图完全一样,只是调用的函数不同。条形图就是将柱形图横过来放。
为条形图添加标签、网格。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [6, 10, 4, 5, 1]
plt.barh(
# 柱体的标签值
x,
# 柱体的高度
y,
# align,设置柱体的相对 x 轴刻度的对齐方式。可选项:edge, center
align='center',
# 颜色
color='b',
# tick_label 刻度的值,用于替换刻度的显示
tick_label=['A', 'B', 'C', 'D', 'E'],
# 透明度,设置范围:[0, 1],越趋近于 0,越透明
alpha=0.2
)
# 标签设置
plt.xlabel('产品代号')
plt.ylabel('产品销量')
# 网格设置
plt.grid(True,
# 轴设置。可选项:x, y, both
axis='both',
# 指定网格样式,比如 - -, *
ls=':',
# 指定颜色
color='r',
# 指定透明度
alpha=0.8)
直方图
import numpy as np
import matplotlib.pyplot as plt
# 随机生成 [0,100) 100 个数
scores = np.random.randint(0, 100, 100)
# 柱体范围。range(0, 101, 10) 表示从 [0, 101) 取数,步长为 10
bins = range(0, 101, 10)
# histtype:柱体填充类型。可选项:step(空心)、bar(实心)
plt.hist(x=scores, bins=bins, color='#3366FF', histtype='step')
plt.xlabel('Python考试成绩')
plt.ylabel('得分学生人数')
plt.show()
直方图与柱状图比较类似,它们的区别是直方图的每个柱体是相连的,而柱状图的每个柱体是独立的。
堆积图
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
# 男性人数
y = [6, 10, 4, 5, 1]
# 女性人数
y1 = [2, 6, 7, 3, 4]
plt.figure(figsize=(8, 5))
# bottom=y1 表示 y1 在 y 的下面
plt.bar(x, y, align='center', bottom=y1, color='#66c2a5', tick_label=['A', 'B', 'C', 'D', 'E'], label='男')
plt.bar(x, y1, align='center', color='#8da0cb', label='女')
plt.xlabel('城市代号')
plt.ylabel('男女比例')
plt.legend()
饼图
import matplotlib.pyplot as plt
font = {'family' : 'SimHei', 'size' : '20'}
plt.rc('font', **font)
labels = ['第一季度', '第二季度', '第三季度', '第四季度']
# 对应每一季度销售额
sale = [20, 40, 30, 70]
# 饼图每一块颜色
colors = ['#FF3399', '#3399CC', '#FF3333', '#00CCCC']
# 边缘偏离半径的百分比。值越大,距离中心越远
explode = (0.1, 0.1, 0.1, 0.3)
plt.pie(sale,
explode=explode,
labels=labels,
# 显示两位小数,以 % 结尾
autopct='%.2f%%',
# 逆时针旋转的角度
startangle=30,
shadow=True,
colors=colors)
# 标题。loc:标题位置。可选项:left, center, right
plt.title('每一季度销售额', loc='center')
plt.show()
极线图
import numpy as np
import matplotlib.pyplot as plt
# 点的数量
bar_slices = 10
# 每个标记点所在射线与极径的夹角(级径:某一点到极点的距离。极点就是极坐标中的原点)
theta = np.linspace(0.0, 2*np.pi, bar_slices, endpoint=False)
# 随机生成极径
r = 30 * np.random.rand(bar_slices)
# marker: 标记图形,mfc:标记的颜色,ms:标记的大小
plt.polar(theta, r, color = 'chartreuse', linewidth=2, marker='*', mfc='b', ms=20)
散点图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
x = np.random.randn(100)
y = np.random.randn(100)
# x 表示 x 轴的值、y 表示 y 轴的值
# s 表示散点大小。可选
# c 表示散点颜色。可选
# cmap 表示将浮点数映射成颜色的颜色映射表
# marker 表示散点图形,可以是*、△、o...。
plt.scatter(x, y, s=np.power(10*a + 20*b, 2),
c=np.random.rand(100),
marker='o')
棉棒图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# 生成 [0.5, 2π) 间均匀的 20 个数
x = np.linspace(0.5, 2*np.pi, 20)
# 生成 20 个符合标准正态分布的随机数
y = np.random.randn(20)
# x:指定棉棒在 x 轴基线上的位置
# y:棉棒的长度
# linefmt:棉棒的样式
# markerfmt:棉棒末端的样式
# basefmt:指定基线的样式
plt.stem(x, y, linefmt='--', markerfmt='o', basefmt='-')
箱体图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
x = np.random.randn(1000)
plt.boxplot(x)
箱体图,即箱线图,从下到上五条线分别表示最小值、下四分位数、中位数、上四分位数和最大值。