文章目录
- 数据可视化Matplotlib库
- 绘制图标的基本流程
- 绘制图表pyplot函数常用参数
- pyplot的中文显示
- pyplot的文本显示函数
- 绘制图标示例
- pyplot的绘图区域
- pyplot的基础图表函数
- 常见图标绘制示例
数据可视化Matplotlib库
Matplotlib库有各种可视化类构成,内部结构复杂
matplotib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式
绘制图标的基本流程
import matplotlib.pyplot as plt
import random
# 1.准备数据
x = range(60)
y = [random.uniform(15, 18) for i in x]
# 2.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 3.绘制图像
plt.plot(x, y)
# 4.图像保存
# 注意:图片保存要放在show前面,show会释放图片资源
plt.savefig("path")
# 5.图像显示
plt.show()
绘制图表pyplot函数常用参数
plt.plot(x, y, format_string, **kwargs)
x:x轴数据,列表或数组, 可选
y:y轴数据,列表或数组
format_string:控制曲线的格式字符串,可选。由颜色字符、风格字符、标记字符组成
颜色字符:"b"蓝色, "g"绿色, "r"红色, "y"黄色, "k"黑色, "w"白色, “#00FF00"RGB颜色
风格字符:”-"实线, "–"破折线, "-."点划线, ":“虚线
标记字符:”."点标记, "o"实心圈标记
**kwargs:第二组或更多(x, y, format_string)
import matplotlib.pyplot as plt
>>> import numpy as np
>>> a = np.arange(10)
>>> plt.plot(a, a*1.5, "go-", a, a*2.5, "rx", a, a*3.5, "*")
pyplot的中文显示
1、pyplot不默认支持中文显示,需要rcParams修改全局字体实现
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
2、在有中文输出的地方,增加一个属性:fontproperties
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0, 5, 0.1)
plt.plot(a, np.cos(a))
plt.xlabel("横轴(值)", fontproperties="SimHei", fontsize=20)
plt.ylabel("纵轴(值)", fontproperties="SimHei", fontsize=20)
plt.show()
pyplot的文本显示函数
plt.xlabel() | 对x轴增加文本标签 |
plt.ylabel() | 对y轴增加文本标签 |
plt.title() | 对图形整体增加文本标签 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注释 |
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0, 10, 0.1)
plt.plot(a, np.cos(a), "b--")
plt.title("cos函数图像", fontproperties="SimHei", fontsize=25)
plt.xlabel("横轴(值)", fontproperties="SimHei", fontsize=15, color="green")
plt.ylabel("纵轴(值)", fontproperties="SimHei", fontsize=15)
plt.text(np.pi*2, 1.0, "峰值", fontproperties="SimHei")
plt.annotate("y=1", xy=(0, 1), xytext=(1, 1.5), arrowprops=dict(facecolor="green", shrink=0.1, width=2))
plt.grid(True) # 网格线
plt.axis([0, 10, -2, 2])
plt.show()
绘制图标示例
import matplotlib.pyplot as plt
import random
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]
# 创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 设置x,y轴和标题信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("温度变化")
# 绘制图像
plt.plot(x,y_shanghai, color="r", label="shanghai")
plt.plot(x, y_beijing, color="g", linestyle="-.", label="beijing")
# 添加x.y轴刻度
# 设置x,y轴刻度
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 修改x,y轴刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 添加网格显示
plt.grid(True, linestyle='--', alpha=0.5)
# 显示图例
plt.legend(loc="best") # best:自动的找一个最好的位置
# 图像显示
plt.show()
pyplot的绘图区域
1、subplot函数
plt.subplot(nrows, ncols, plot_number) # plot_number是当前那个区域
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
a = np.arange(0.0, 5.0, 0.02) # 从0.0到5.0步长为0.02
plt.subplot(2, 1, 1)
plt.plot(a, f(a))
plt.subplot(2, 1, 2)
plt.plot(a, np.cos(a))
plt.show()
2、使用subplot2grid函数
plt.subplot2grid(GridSpace, CurSpec, colspan=1, rowspan=1)
设定网格,选中网格,确定选中行列区域数量,编号从0开始
例如plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
3x3网格,选中(1,0)区域,列延伸2两个网格,行延伸两个网格
3、使用GridSpec类
面向对象方式使用画图
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
gs = gridspec.GridSpec(3, 3) # 3x3网格
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :-1])
subplot示例
# 准备数据
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]
# 创建画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)
# 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("shanghai")
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("beijing")
# 绘制图像
axes[0].plot(x, y_shanghai, color="r", label="shanghai")
axes[1].plot(x, y_beijing, color="g", linestyle="-.", label="beijing")
# 添加x.y轴刻度
# 设置x,y轴刻度
x = range(60)
y_ticks = range(40)
x_ticks_label = ["11点{}分".format(i) for i in x]
# 修改x,y轴刻度显示
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
# 添加网格显示
axes[0].grid(True, linestyle='--', alpha=0.5)
axes[1].grid(True, linestyle='--', alpha=0.5)
# 显示图例
axes[0].legend(loc="best") # best:自动的找一个最好的位置
axes[1].legend(loc="best") # best:自动的找一个最好的位置
# 图像显示
plt.show()
pyplot的基础图表函数
plt.plot(x, y, fmt, …) | 绘制一个坐标图 |
plt.boxplot(data, motch, position) | 绘制一个箱型图 |
plt.bar(left, height, width, bottom) | 绘制一个条形图 |
plt.barh(width, bottom, left, height) | 绘制一个横向条形图 |
plt.polar(theta, r) | 绘制极坐标图 |
plt.pie(data, explode) | 绘制饼图 |
plt.cohere(x, y, NFFT=256, Fs) | 绘制x-y的相关性函数 |
plt.scatter(x, y) | 绘制散点图,其中x和y长度相同 |
plt.hist(x, bins, normed) | 绘制直方图 |
plt.plot_date() | 绘制数据日期 |
常见图标绘制示例
pyplot散点图的绘制
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots() # 默认是111
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
ax.set_title("Simple Scatter")
plt.show()
pyplot饼图的绘制
import matplotlib.pyplot as plt
labels = "Frogs", "Hogs", "Dogs", "Logs"
sizes = [15, 30, 45, 10]
explodes = (0, 0.1, 0, 0) # 指出那一块突出来
plt.pie(sizes, explode=explodes, labels=labels, autopct="%1.1f%%",
shadow=False, startangle=90) # shadow是否有阴影, startangele起始角度
plt.axis("equal") # 正圆形
plt.title("饼图", fontproperties="SimHei")
plt.show()
pyplot直方图的绘制
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
mu, sigma = 100, 20 # 均值和标准差
a = np.random.normal(mu, sigma, size=100) # 正态分布
plt.hist(a, 40, density=1, histtype="stepfilled",
facecolor="b", alpha=0.75)
# 40表示直方条的个数
# density=0时纵坐标是出现的次数,density=1时表示概率
plt.title("Histogram")
plt.show()
pyplot极坐标图的绘制
import matplotlib.pyplot as plt
import numpy as np
N = 20 # 数据个数
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False) # 0.0到2pi填充N个数据
radii = 10 * np.random.rand(N) # 随机生成N个数的数组
width = np.pi / 4 * np.random.rand(N) # 宽度值
ax = plt.subplot(111, projection="polar")
# left:theta, height:radii, width:width
bars = ax.bar(theta, radii, width=width, bottom=0.0)
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.viridis(r/10.0))
bar.set_alpha(0.5)
plt.show()
散点
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
X, y = make_blobs(random_state=1)
color = ["red", "blue", "green"]
agg = AgglomerativeClustering(n_clusters=3)
assigment = agg.fit_predict(X)
for i in range(len(X)):
a = X[i, 0]
b = X[i, 1]
s = assigment[i]
plt.scatter(a, b, s=20, c=color[s])
plt.legend(color)
plt.show()