折线图和散点图
均在jupyter notebook上进行演示
图片展示用plt.show()
图片保存用plt.savefig(“path”)
要保存图片完毕后才可以用show 不然保存的图片为空白
随机数据作图
#折线图
x = [1,2,3]
y = [1,2,3]
#没有子图的绘图
plt.title('line') # 添加标题
plt.xlabel('x') # 添加x轴名称‘x’
plt.ylabel('y') # 添加y轴名称‘y’
plt.plot(x,y) # 绘制折线图
plt.scatter(x,y) # 绘制散点图
plt.text(2.5,2,'y = x') # 在图中x=2.5,y=2处添加‘y=x’
plt.style.use('_mpl-gallery') #设置绘图风格:_mpl-gallery
plt.show()
#有子图的绘图
p = plt.figure(figsize=(4,6),dpi=80) # 创建画布。大小为4×6,像素为80
#添加子图
ax1 = p.add_subplot(2,1,1) # 分为2×1图形阵,选择第1张图片绘图
plt.title('折线图') # 添加标题
plt.rcParams['lines.linestyle'] = '--' # 修改线条类型
plt.rcParams['lines.linewidth'] = 3 # 修改线条宽度
plt.rcParams['axes.edgecolor'] = 'r' # 轴颜色设置为红色
plt.rcParams['axes.spines.top'] = False # 去除顶部轴
plt.rcParams['axes.spines.right'] = False # 去除右侧轴
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False # 解决负号“-”显示异常
plt.plot(x,y)
ax2 = p.add_subplot(2,1,2) # 分为2×1图形阵,选择第2张图片绘图
plt.title("散点图")
plt.scatter(x,y) # 绘制散点图
plt.show()
读取数据作图
#读取数据
data = np.load(r'./data/国民经济核算季度数据.npz',allow_pickle=True)
# print(len(data['values']))六十九个数据
# print(data.files) #['columns', 'values']
print(data['columns']) # 提取columns数组,视为数据的标签
values = data['values'] # 提取values数组,数据的存在位置
values
运行结果为
作散点图
plt.figure(figsize=(12,8),dpi=80)
plt.title('2000-2017年三大产业个季度国民生产总值')
plt.xlabel('时间')
plt.ylabel('生产总值(亿元)')
plt.scatter(values[:,0],values[:,2],marker='D',c = 'r',alpha = 0.5) # 国内生产总值散点为红色
plt.scatter(values[:,0],values[:,3],c='y') # 第一产业增加值散点为黄色
plt.scatter(values[:,0],values[:,4],c='g') # 第二产业增加值散点为绿色
plt.scatter(values[:,0],values[:,5]) # 第三产业增加值散点颜色默认值 此处为蓝色
plt.xticks(values[::4,0],values[::4,1],rotation = 90) #添加x轴坐标,并旋转45/90度
plt.legend(['第一产业','第二产业','第三产业']) # 添加图例
plt.show()
有子图绘制
p = plt.figure(figsize=(12,6))
ax1 = p.add_subplot(1,2,1)
plt.title('2000-2017年度三大产业国民生产总值')
plt.xlabel('时间')
plt.ylabel('生产总值(亿元)')
plt.rcParams['lines.linestyle'] = '-' # 修改线条类型
plt.plot(values[:,0],values[:,3])
plt.plot(values[:,0],values[:,4])
plt.plot(values[:,0],values[:,5])
plt.xticks(values[::4,0],values[::4,1],rotation = 90) # x轴的标识点是否rotation旋转
plt.legend(['第一产业','第二产业','第三产业'])
ax2 = p.add_subplot(1,2,2)
plt.title('2000-2017年三大产业个季度国民生产总值')
plt.xlabel('时间')
plt.ylabel('生产总值(亿元)')
plt.scatter(values[:,0],values[:,2],marker='D',c = 'r',alpha = 0.5)
# marker = 'D' 散点为方形 c = 'r' 散点为红色 alpha = 0.5 透明度为0.5
plt.scatter(values[:,0],values[:,3],c='y')
plt.scatter(values[:,0],values[:,4])
plt.scatter(values[:,0],values[:,5])
plt.xticks(values[::4,0],values[::4,1],rotation = 45)
plt.legend(['第一产业','第二产业','第三产业'])
plt.show()
直方图
#直方图
x = np.random.normal(0,1,10000) # 生成10000个服从标准正态分布数据
plt.title('标准正太分布直方图')
plt.hist(x)
plt.show()
#直方图
plt.figure(figsize=(6,4))
x = np.random.normal(0,1,10000) # 生成10000个服从标准正态分布数据
plt.title('标准正太分布直方图')
# plt.hist(x)
n, bins, patches = plt.hist(x)
for i in range(len(n)):
plt.text(bins[i], n[i]*1, int(n[i]), fontsize=12, horizontalalignment="center",va="bottom") #打标签,在合适的位置标注每个直方图上面样本数)
柱状图(条形图)
#条形图
plt.figure(figsize=(6,4))
x = values[-1,3:6]
plt.bar(range(3),x,width = 0.5)
plt.title('2017年第一季度三大产业生产总值')
plt.xlabel('类别')
plt.ylabel('生产总值(亿元)')
plt.xticks(range(3),['第一产业','第二产业','第三产业'])
for i in range(3):
plt.text(i,x[i],x[i],ha = 'center',va = 'bottom')# 打标签,在合适的位置标注每个直方图上面样本数
plt.show()
饼图
#饼图
plt.figure(figsize=(5,5))
x = values[-1,3:6]
plt.title('2017年第一季度三大产业生产总值分布情况')
plt.pie(x,labels=['第一产业','第二产业','第三产业'],autopct='%0.2f%%',explode = [0.1,0,0],labeldistance=1.2)
plt.show()
箱线图
#箱线图
plt.figure(figsize=(5,5))
x = values[:,3:6]
plt.title('三大产业分布情况')
plt.xlabel('类别')
plt.ylabel('分布')
plt.boxplot(x,labels=['第一产业','第二产业','第三产业'])
plt.show()
一个示例:分析人口数据
读取数据
# 读取数据
import numpy as np
import matplotlib.pyplot as plt
data = np.load(r'./data/populations.npz',allow_pickle = True)
# print(data.files) #['data', 'feature_names']
values = data['data']
# print(data['feature_names'])
# ['时间' '年末总人口(万人)' '男性人口(万人)' '女性人口(万人)' '城镇人口(万人)' '乡村人口(万人)']
data['data']
绘制散点图和折线图
plt.plot()函数
plt.plot(x, y, format_string, **kwargs)
参数 | 说明 |
---|---|
x | X轴数据,列表或数组,可选 |
y | Y轴数据,列表或数组 |
format_string | 控制曲线的格式字符串,可选 |
**kwargs | 第二组或更多(x,y,format_string),可画多条曲线 |
format_string
由颜色字符、风格字符、标记字符组成
color : 控制颜色, color=‘green’
linestyle : 线条风格, linestyle=‘dashed’
marker : 标记风格, marker=‘o’
markerfacecolor: 标记颜色, markerfacecolor=‘blue’
markersize: 标记尺寸, markersize=2
颜色字符
- ‘b’ 蓝色 ‘m’ 洋红色 magenta
- ‘g’ 绿色 ‘y’ 黄色
- ‘r’ 红色 ‘k’ 黑色
- ‘w’ 白色 ‘c’ 青绿色 cyan
- ‘#008000’ RGB某颜色 ‘0.8’ 灰度值字符串
- 多条曲线不指定颜色时,会自动选择不同颜色
风格字符
- ‘‐’ 实线
- ‘‐‐’ 破折线
- ‘‐.’ 点划线
- ‘:’ 虚线
- ‘’ ’ ’ 无线条
标记字符
- ‘.’ 点标记
- ‘,’ 像素标记(极小点)
- ‘o’ 实心圈标记
- ‘v’ 倒三角标记
- ‘^’ 上三角标记
- ‘>’ 右三角标记
- ‘<’ 左三角标记…等等
plt.scatter()函数用于生成一个散点图
matplotlib.pyplot.scatter(x,
y,
s=20,
c='b',
marker='o',
cmap=None,
norm=None,
vmin=None,
vmax=None,
alpha=None,
linewidths=None,
verts=None,
hold=None,
**kwargs)
参数:
-
x,y:表示的是shape大小为(n,)的数组,也就是我们即将绘制散点图的数据点,输入数据。
-
s:表示的是大小,是一个标量或者是一个shape大小为(n,)的数组,可选,默认20。
-
c:表示的是色彩或颜色序列,可选,默认蓝色’b’。但是c不应该是一个单一的RGB数字,也不应该是一个RGBA的序列,因为不便区分。c可以是一个RGB或RGBA二维行数组。
-
marker:MarkerStyle,表示的是标记的样式,可选,默认’o’。
-
cmap:Colormap,标量或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap,可选,默认None。
-
norm:Normalize,数据亮度在0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认None。
-
vmin,vmax:标量,当norm存在的时候忽略。用来进行亮度数据的归一化,可选,默认None。
-
alpha:标量,0-1之间,可选,默认None。
-
linewidths:也就是标记点的长度,默认None。
p = plt.figure(figsize=(12,10))
#子图1
ax1 = p.add_subplot(2,2,1)
plt.title('人口总数散点图')
plt.scatter(values[0:20,0],values[:20,1])
plt.xticks(rotation = 45)
#子图2
ax2 = p.add_subplot(2,2,2)
plt.title('各类别人口数散点图')
plt.scatter(values[:20,0],values[:20,2],c='y')
plt.scatter(values[:20,0],values[:20,3],c='r')
plt.scatter(values[:20,0],values[:20,4],c='g')
plt.scatter(values[:20,0],values[:20,5])
plt.legend(["男性人口","女性人口","城镇人口","农村人口"],loc='lower left')
plt.xticks(rotation = 45)
#子图3
ax3 = p.add_subplot(2,2,3)
plt.title('人口总数折线图')
plt.plot(values[0:20,0],values[:20,1])
plt.xticks(rotation = 45)
#子图4
ax4 = p.add_subplot(2,2,4)
plt.title('各类别人口数折线图')
plt.plot(values[:20,0],values[:20,2])
plt.plot(values[:20,0],values[:20,3])
plt.plot(values[:20,0],values[:20,4])
plt.plot(values[:20,0],values[:20,5])
plt.legend(["男性人口","女性人口","城镇人口","农村人口"],loc='best')
# loc 图例位置 upper right lower left
plt.xticks(rotation = 45)
plt.show()
绘制直方图
plt. bar添加数据标签
plt.bar_label()函数,为条形图添加数据标签
函数参数
-
container
container :添加数据标签的条形图名称
-
labels
labels:数据标签列表
-
fmt
fimt:数据标签的格式,默认:%g
-
label_type
label_type:数据标签所处的位置,取值为‘center’或’edge’
center:数据标签位于条形图的条形中间
edge:数据标签位于条形图的顶端
默认值:edge
-
padding
padding:数据标签与条形图中的每个条形的水平距离
默认值:0
# 直方图
p = plt.figure(figsize=(12,10))
ax1 = p.add_subplot(2,2,1)
plt.title('1996年男女人口分布')
p1 = plt.bar(range(2),values[-3,2:4],width=0.4)
plt.xticks(range(2),['男','女'])
plt.bar_label(p1,labels=values[-3,2:4],padding=5,fontsize = 20)
#padding:数据标签与条形图中的每个条形的水平距离 默认为0
ax2 = p.add_subplot(2,2,2)
plt.title('2015年男女人口分布')
plt.bar(range(2),values[0,2:4],width=0.3)
plt.xticks(range(2),['男','女'])
ax3 = p.add_subplot(2,2,3)
plt.title('1996年城乡人口分布')
plt.bar(range(2),values[-3,4:],width=0.3)
plt.xticks(range(2),['城','乡'])
ax4 = p.add_subplot(2,2,4)
plt.title('1996年城乡人口分布')
plt.bar(range(2),values[0,4:],width=0.3)
plt.xticks(range(2),['城','乡'])
plt.show()
绘制饼图
import matplotlib.pyplot as plt
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False,
rotatelabels=False, *, normalize=None, data=None)
常用参数:
- x即每个扇形的占比的序列或数组
- explode如果不是None,则是一个len(x)长度的数组,指定每一块的突出程度;突出显示,设置每一块分割出来的间隙大小
- labels为每个扇形提供标签的字符串序列
- colors为每个扇形提供颜色的字符串序列
- autopct如果它是一个格式字符串,标签将是fmt % pct。如果它是一个函数,它将被调用。
- shadow阴影
- startangle从x轴逆时针旋转,饼的旋转角度
- pctdistance, default: 0.6每个饼片的中心与由autopct生成的文本的开头之间距离与半径的比率,大于1的话会显示在圆外
- labeldistance, default: 1.1饼状图标签绘制时的径向距离(我认为这个也与8类似是个比率)。如果设置为None,则不绘制标签,而是存储在图例()中使用。
#饼图
p = plt.figure(figsize=(8,8))
ax1 = p.add_subplot(2,2,1)
plt.title('1996年男女人口占比')
plt.pie(values[-3,2:4],labels=['男','女'],autopct='%0.2f%%')
ax2 = p.add_subplot(2,2,2)
plt.title('2015年男女人口占比')
plt.pie(values[0,2:4],labels=['男','女'],autopct='%0.2f%%')
ax3 = p.add_subplot(2,2,3)
plt.title('1996城乡人口占比')
plt.pie(values[-3,4:],labels= ['城','乡'],autopct='%0.2f%%')
ax4 = p.add_subplot(2,2,4)
plt.title('2015城乡人口占比')
plt.pie(values[0,4:],labels= ['城','乡'],autopct='%0.2f%%')
plt.show()
绘制箱线图
参数详解
plt.boxplot(x, # x:指定要绘制箱图的数据
notch=None, # notch:是否是凹口的形式展现箱线图,默认非凹口
sym=None, # sym:指定异常点的形状,默认为+号显示
vert=None, # vert:是否需要将箱线图垂直摆放,默认垂直摆放
whis=None, # whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差
positions=None, # positions:指定箱线图的位置,默认为[0,1,2…]
widths=None, # widths:指定箱线图的宽度,默认为0.5
patch_artist=None, # patch_artist:是否填充箱体的颜色
meanline=None, # meanline:是否用线的形式表示均值,默认用点来表示
showmeans=None, # showmeans:是否显示均值,默认不显示
showcaps=None, # showcaps:是否显示箱线图顶端和末端的两条线,默认显示
showbox=None, # showbox:是否显示箱线图的箱体,默认显示
showfliers=None, # showfliers:是否显示异常值,默认显示
boxprops=None, # boxprops:设置箱体的属性,如边框色,填充色等
labels=None, # labels:为箱线图添加标签,类似于图例的作用
flierprops=None, # filerprops:设置异常值的属性,如异常点的形状、大小、填充色等
medianprops=None, # medianprops:设置中位数的属性,如线的类型、粗细等
meanprops=None, # meanprops:设置均值的属性,如点的大小、颜色等
capprops=None, # capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等
whiskerprops=None) # whiskerprops:设置须的属性,如颜色、粗细、线的类型等
#箱线图
plt.figure(figsize=(6,6))
plt.boxplot(values[0:20,1:],labels=['总体','男','女','城','乡'])
plt.show()