数据可视化
库的导入:import matplotlib.pyplot as plt
绘制折线图,并保存
(1)
import matplotlib.pyplot as plt
plt.plot([3, 1, 4, 5, 2]) # 默认为y轴坐标 x坐标默认为索引值
plt.ylabel("grade")
plt.savefig("test", dpi=600) # 格式为PNG文件,图像名称为test,dpi表示每英寸包含的像素点个数
plt.show()
(2)
plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2]) # 依次为横纵坐标
plt.ylabel("Grade") # y轴名称
plt.axis([-1, 10, 0, 6]) # 横纵坐标范围
plt.show()
pyplot绘图区域
plt.subplot(nrows, ncols, plot_number)
# pyplot绘图区域
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)
plt.subplot(2, 1, 1) # 图像分区
plt.plot(a, f(a))
plt.subplot(2, 1, 2) # 图像分区
plt.plot(a, np.cos(2*np.pi*a), "r--")
plt.show()
plt.plot(x, y, format_string, **kwargs)
x: x轴数据,列表或数组,可选
y:y轴数据,列表或数组
format_string: 控制曲线的格式字符串,可选 由颜色字符、风格字符、标记字符组成
颜色字符:
“b”蓝色
“g”绿色
“r”红色
“c”青绿色
“m”洋红色
“y”黄色
“k”黑色
“w”白色
“0.8”灰度值字符串
风格字符:
“-”实线
“--”破折线
“-.”点划线
“:”虚线
“”””无线条
标记字符:
“.”点标记
“,”像素标记(一个非常小的点)
“o”实心圈标记
“v”倒三角标记
“^”上三角标记
“>”右。。。
“<”左。。。
“1”下花三角标记
“2”上花三角
“3”左花三角
“4”右花三角
“s”实心方形标记
“p”实心五角标记
“*”星型标记
“h”竖六边形标记
“H”横六边形标记
“+”十字标记
“x”x标记
“D”菱型标记
“d”瘦菱型标记
“|”垂直线标记
# plot函数使用具体
a = np.arange(10)
plt.plot(a, a, "go-", a, 2*a, "rx", a, 3*a, "*", a, 4*a, "b-.")
plt.show()
**kwargs: 第二组后更多(x, y, format_string)即绘制多条曲线
注意:当绘制多条曲线时,各条曲线的x不能省略
color:控制颜色,color=”green”
linestyle:线型风格,linestyle=”dashed”
marker:标记风格,marker=”o”
markerfacecolor:标记颜色,markerfacecolor=”blue”
markersize:标记尺寸,markersize=20
中文显示方法一:
rcParams的属性:
# 法(1)
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams["font.family"] = "SimHei" # SimHei为中文黑体
plt.plot([3, 1, 4, 5, 2])
plt.ylabel("纵轴(值)")
plt.savefig("test", dpi=600) # 保存图片
plt.show()
“font.family”显示字体名字,
更多字体:’SimHei’为中文黑体 ‘Kaiti’ 中文楷体 ‘LiSu’中文隶书 ‘FangSong’中文仿宋 ‘YouYuan’中文幼圆 ‘STSong’ 华文宋体
“font.style”字体风格,正常”normal”或斜体”italic”
“font.size”字体大小,整数字号或者”large”、”x-small”
# 更多字体
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 20
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间')
plt.ylabel('纵轴:振幅')
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()
中文显示方法二:
在有中文输出的地方,增加一个属性:fontproperties
好处:不是全局修改字体,比较灵活,推荐使用
# 方法二
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=25)
plt.ylabel('纵轴:振幅', fontproperties='Kaiti', fontsize=25)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()
plt.xlabel() 对x轴增加文本标签
plt.ylabel() 对y轴增加文本标签
plt.title() 对图形整体增加文本标签 (位于图形正上方)
plt.text() 在任意位置增加文本
plt.annotate() 在图形中增加带箭头的注解
# pyplot 文本显示函数
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=25, color='green')
plt.ylabel('纵轴:振幅', fontproperties='Kaiti', fontsize=25)
# $括起来的文字是LaTeX文本语法
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=35)
# plt.text(2, 1, r'$\mu=100$', fontsize=15) # 2, 1,表示文本放置的位置为坐标轴(2, 1)
# xy=(2, 1)表示箭头所在坐标,xytext=(3, 1.5)表示文本所在坐标,arrowprops表示箭头属性
# 依次为颜色、箭头两端留有有一定空白区域、箭头宽度
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True) # 加入网格线
plt.show()
plt.subplot() plt.subplot2grid()--------------->可以定制各个板块区域大小
plt.subplot2grid(GridSpec, Curspec, colspan=1, rowspan=1)
目前用不到......
plt.plot(x, y, fmt, ...) 绘制一个坐标图(也可以是极坐标系)
plt.boxplot(data, notch, position) 绘制一个箱型图
plt.bar(left, height, width, bottom) 绘制一个条形图
plt.barh(width, bottom, left, height) 绘制一个横向条形图
plt.polar(theta, r) 绘制一个极坐标图
plt.pie(data, explode) 绘制饼图
plt.psd(x, NFFT=256, pad_to, Fs) 功率谱密度图
plt.specgram(x, NFFT=256, pad_to, F) 绘制谱图
plt.cohere(x, y, NFFT=256, Fs) 绘制x -- y相关性函数
plt.scatter(x, y) 绘制散点图,其中x和y长度相同
plt.step(x, y, where) 绘制步阶图
plt.hist(x, bins, normed) 绘制直方图
plt.contour(X, Y , Z, N) 绘制等值图
plt.vlines()绘制垂直图
plt.stem(x, y, linefmt, markerfmt)绘制柴火图
plt.plot_data()绘制数据日期
# (1)pyplot饼图绘制
import matplotlib.pyplot as plt
labels = "Frogs", "Hogs", "Dogs", "Logs" # 标签
size = [15, 30, 45, 10] # 每份标签所占比例
explode = (0, 0.1, 0, 0.2) # 将饼图中 30 部分突出出来显示(突出比例为0.1),依次类推
# pie图中参数依次表示饼图尺寸、突出部分、标签、中间显示百分数的方式、
# False表示二维图,True表示三维(即存在阴影)、饼图起始角度
plt.pie(size, explode=explode, labels=labels, autopct="%1.1f%%",
shadow=False, startangle=90)
plt.axis("equal") # 饼图为正形(没有角度差异)
plt.show()
说明:横坐标连续
plt.hist()
Matplotlib.pyplot中hist()的参数:
n, bins, patches = plt.hist(arr, bins=10, normed=0,facecolor='black', edgecolor='black',alpha=1,histtype='bar')
hist的参数非常多,但常用的就这六个,只有第一个是必须的,后面四个可选
arr: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
facecolor: 直方图颜色
edgecolor: 直方图边框颜色
alpha: 透明度
histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
(1)单变量直方图
# (2)pyplot直方图的绘制
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0) # seed 种子可以产生一类随机数(各种各样,不过数据内容固定)
mu, sigma = 100, 20 # 设定均值和方差
a = np.random.normal(mu, sigma, size=100) # normal产生正态分布数组
# 下列属性依次为,数组a、直方图个数(bins -----> 条的个数)、normed=1表示每个方块内元素出现的概率
# normed=0表示每个方块内元素出现的数目、
plt.hist(a, bins=50, normed=1, histtype="stepfilled", facecolor="b", alpha=0.75)
plt.title("Histogram") # Histogram直方图 --------> 标题
plt.show()
(2)双变量直方图绘制
说明:x, y 均为变量,使用颜色深浅表示数量多少
# <2> 双变量直方图,颜色深浅表示数量(密度)
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000) + 2 # x轴中心为2
y = np.random.randn(1000) + 5 # y轴中心为5
plt.hist2d(x, y, bins=40) # 绘制双变量
plt.show()
待更......
散点图作用:绘出散点图后可以帮助了解两个变量的相关性(正相关、负相关、无关),比如,判断商品两个时间的价格(以两个时间的价格为横纵坐标描点绘图)
法一:
# (4)pyplot散点图的绘制,法一:直接使用plot绘制,法二:使用面向对象方法绘制
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # 括号为空时表示绘制的图形只有一个区域
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), "o") # 横纵坐标均为正态分布数值*10,形状为o形
ax.set_title("Simple Scatter") # 标题
plt.show()
法二:
# 散点图
import numpy as np
import matplotlib.pyplot as plt
# # 随机散点图
# n = 1000
# x = np.random.randn(n)
# y1 = np.random.randn(n)
# plt.scatter(x, y1)
# plt.show()
# 正相关散点图
n = 1000
x = np.random.randn(n)
y2 = x + np.random.randn(n) * 0.5 # 若想变为负相关,则在x前面加一个负号
plt.scatter(x, y2, s=15, c="r", marker=">", alpha=0.5) # s(面积) 可以修改点的大小,
# c(color颜色)修改颜色,marker修改点的形状, alpha修改透明度(点过于集中时便于查看,点的分布情况)
plt.show()
负相关
# 折线图(数据随时间的变化趋势)
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 5) # 分为五份
y = x**2
plt.plot(x, y)
plt.show()
比较不同季度的销售
# 条形图(比较多个项目分类数据的大小)
import numpy as np
import matplotlib.pyplot as plt
n = 5
y = [20, 30, 15, 10, 35]
index = np.arange(n)
# 横向
plt.subplot(2, 1, 1)
p1 = plt.bar(left=index, height=y, color="r", width=0.5)
# 纵向
plt.subplot(2, 1, 2)
p2 = plt.bar(left=0, bottom=index, width=y, color="r", height=0.5, orientation="horizontal")
# orientation="horizontal"表示水平展示
# 横向也可以是 p2 = plt.barh(left=0, bottom=index, width=y)
plt.show()
多组条形图比较:
(1)并列比较
# 多组条形图比较
import numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
sales_BJ = [52, 55, 65, 45]
sales_SH = [44, 36, 65, 41]
bar_width = 0.3
plt.bar(index, sales_BJ, bar_width, color="b")
plt.bar(index+1.5*bar_width, sales_SH, bar_width, color="r")
plt.show()
(2)层叠比较
# (2)层叠比较
import numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
sales_BJ = [52, 55, 65, 45]
sales_SH = [44, 36, 65, 41]
bar_width = 0.3
plt.bar(index, sales_BJ, bar_width, color="b")
plt.bar(index, sales_SH, bar_width, color="r", bottom=sales_BJ)
plt.show()
说明:图可以分为上边缘、上四分位数、中位数、下四分位数、下边缘、异常值
# # 箱型图(显示数据分散情况)
# # <1> 绘制一个箱型图
# import numpy as np
# import matplotlib.pyplot as plt
# np.random.seed(100)
# data = np.random.normal(size=1000, loc=0, scale=1)
# plt.boxplot(data, sym=".", whis=1.5) # sym 表示异常值点的形状,whis表示异常值的范围(默认为1.5)
# plt.show()
# <2> 绘制多个箱型图
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=(1000, 4), loc=0, scale=1)
labels = ["A", "B", "C", "D"]
plt.boxplot(data, labels=labels, sym=".")
plt.show()
颜色:b :green g :green r :red c :cyan m :magenta y :yellow k :black w :white
(百度“颜色代码”)
点样式:. , o v ^ < > 1 2 3 8 s p * h H + D d | _
线样式(只有四种):- 实线 -- 虚线 -. 点划线 :点线
# 颜色和样式修改
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
# 样式依次为线型、颜色、点形状(marker可以不写,如果不写不会划线)
plt.plot(y, '--', color="b", marker=".")
plt.plot(y + 1, '-.', color="g", marker=",")
plt.plot(y + 2, ':', color="r", marker="o")
plt.plot(y + 3, '-', color="c", marker="v")
plt.plot(y + 4, color="m", marker="^")
plt.plot(y + 5, color="y", marker="<")
plt.plot(y + 4, color="k", marker="1")
plt.plot(y + 4, color="w", marker="3")
plt.show()
样式字符串:将颜色、点型、线型写成一个字符串
如:cx-- mo: kp-
# 样式字符串:将颜色、点型、线型写成一个字符串
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
plt.plot(y, 'cx--')
plt.plot(y + 1, 'kp:')
plt.plot(y + 2, 'mo-.')
plt.plot(y + 3, 'k-')
plt.show()
(1)pyplot画法:
# pyplot画法
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 1)
y = np.random.randn(len(x))
plt.plot(x, y)
plt.title("pyplot")
plt.show()
(2)面向对象画法
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 100)
fig = plt.figure() # 添加画板
ax1 = fig.add_subplot(221) # 添加坐标轴,以及分区
ax1.plot(x, x) # 添加图像
ax2 = fig.add_subplot(222)
ax2.plot(x, -x)
ax3 = fig.add_subplot(223)
ax3.plot(x, x**2)
ax4 = fig.add_subplot(224)
ax4.plot(x, np.log(x))
plt.show()
# 生成多图(多个figure)
import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.plot([1, 2, 3], [3, 2, 1])
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.plot([1, 2, 3], [1, 2, 3])
plt.show()
# 绘制网格
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, x*2)
ax.grid(color="g", linewidth=1.5, linestyle="--") # 依次为设置颜色、网格线粗细、线型
plt.show()
# 图例
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 11, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
l, = plt.plot(x, x*2, label="Normal")
l1, = plt.plot(x, x*3, label="fast")
ax.plot(x, x*4, label="faster")
plt.legend(loc=0) # 显示图例
# (loc表示location,loc=1-----> 图例在右上角显示,
# loc=2表示图例在左上角显示,0。。。3。。。4。。。)
plt.show()
# 坐标轴范围调整
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
figure = plt.plot(x, x*x)
plt.axis([-15, 15, 0, 50]) # 直接修改横纵坐标
# 只调节某一个轴
# plt.xlim([-10, 10])
# plt.ylim([0, 100])
# 只调节一边
plt.xlim(xmin=-10)
plt.ylim(ymax=100)
plt.show()
# 调整坐标轴刻度
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 11, 1)
plt.plot(x, x)
ax = plt.gca() # 获取当前图形坐标轴
ax.locator_params(nbins=20) # nbins表示坐标轴有多少格
ax.locator_params("x", nbins=5) # 只调整x轴
plt.show()
# 添加坐标轴
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2, 20, 1)
y1 = x*x
y2 = np.log(x)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x, y1)
ax1.set_ylabel("Y1")
ax2 = ax1.twinx() # 绘制在同一x轴上(双y 轴)
ax2.plot(x, y2, "r")
ax2.set_ylabel("Y2")
ax1.set_xlabel("compare Y1 and Y2")
plt.show()
# 注释
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
y = x*x
plt.plot(x, y)
# 属性依次为文本内容、箭头起点、文本起点、箭头颜色箭头头部宽度以及箭头身体宽度
plt.annotate("this is the bottom", xy=(0, 5), xytext=(0, 50),
arrowprops=dict(facecolor="r", headwidth=10, width=2))
plt.show()
# 文字(只插入文字内容)
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
y = x*x
plt.plot(x, y)
plt.text(-2, 40, "function: y = x*x ", family="fantasy", size=15, color="g", style="oblique")
# family表示字体样式,size表示字号,颜色、style表示斜体与正体(默认为正)
plt.show()
#
import matplotlib.pyplot as plt
import numpy as np
# 快速美化
plt.style.use("bmh") # ggplot是美化的版式,类似还有dark_background bmh (推荐) grayscale fivethirtyeight(推荐)
fig, axes = plt.subplots(ncols=2, nrows=2)
ax1, ax2, ax3, ax4 = axes.ravel()
x, y = np.random.normal(size=(2, 100))
ax1.plot(x, y, "o")
x = np.arange(0, 10)
y = np.arange(0, 10)
ncolors = len(plt.rcParams["axes.color_cycle"])
plt.show()