逐
逐禅
V1
2022/09/10阅读:39主题:兰青
数据分析|python可视化基础操作(1)
python数据可视化基本操作(1)
matplotlib基础绘图
首先绘制的是折线图
from matplotlib import pyplot as plt
x=range(2,26,2) # 从2开始到24生成等差数列,步长为2
y = [15,13,14.5,17,28,25,26,26,24,22,18,15]
#x轴和y轴对应位置的数字组成的坐标就是要绘制的点
# 设置图片大小
fig=plt.figure(figsize=(20,8),dpi=80)
# figsize表示的绘图的大小,里面的参数表示长度和宽度
# 当图形比较模糊的时候,考虑传入dpi参数,让图片更加清晰
plt.plot(x,y) # 传入x和y,通过plot绘制出折线图
# 设置x轴的刻度
plt.xticks(range(2,25)) # 如果括号里是x则表示显示x中的所有刻度
# 可以手动设置x轴1的刻度范围,和密集程度
# 更密集
# _xticks_labels=[i/2 for i in range(2,49)]
# plt.xticks(_xticks_labels)
# 如果想要刻度稀疏一些,只需在_xticks_labels里传如一个参数
# plt.xticks(_xticks_labels[::3]) # 就是对_xticks_labels
#序列每隔3个取一个。
# 调整y轴的刻度
plt.yticks(range(min(y),max(y))) # 括号里填y就对应y原本的刻度
# 调整方法和y轴是一样的
# 保存图片
#plt.savefig("C:\\Users\\wgw\Desktop\\pytest.svg")
# 将生成的图片保存为svg格式的矢量图,也可以是png;jpg
plt.show() # 在程序执行后展示图形

如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
import random
from matplotlib import pyplot as plt
x=range(0,120)
y=[random.randint(20,35) for i in range(120)]
fig=plt.figure(figsize=(28,10),dpi=80)
plt.xticks(range(0,121))
plt.yticks(range(20,36))
plt.plot(x,y)
plt.show()

设置中文及坐标刻度
将x轴的刻度设置成时间类型的字符串,以及在图表中显示中文,中文设置参考了csdn博客[1]
import random
import matplotlib
from matplotlib import pyplot as plt
# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
x=range(0,120)
y=[random.randint(20,35) for i in range(120)]
fig=plt.figure(figsize=(40,10),dpi=80)
# 调整x的刻度
_xticks_labels=["10点{}分".format(i) for i in range(60)]
_xticks_labels+=['11点{}分'.format(i) for i in range(60)]
plt.xticks(list(x)[::3],_xticks_labels[::3],rotation=90)
# rotation表示旋转的角度
plt.yticks(range(20,36))
plt.plot(x,y)
plt.show()

上面所用的方法是作用在全局范围的,将所有字体都设置为黑体,如果相对图表中的不同部分采用个性化设置,可以用'FontProperties'
设置。例如:
from matplotlib.font_manager import FontProperties
font1 = FontProperties(fname=r"c:\windows\fonts\simsun.ttc")
font2 = FontProperties(fname=r"c:\windows\fonts\STHUPO.TTF")
font3 = FontProperties(fname=r"c:\windows\fonts\STCAIYUN.TTF")
plt.xlabel("横轴/单位",fontproperties=font1)
plt.ylabel("纵轴/单位",fontproperties=font2)
plt.title("标题",fontproperties=font3)
上面设置的字体来自于计算机系统,可以根据路径查看:
C:\Windows\Fonts
,进入点就相应字体的属性就能获取其地址,此处参考了博客。
对图表添加描述信息
import random
import matplotlib
from matplotlib import pyplot as plt
# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
x=range(0,120)
y=[random.randint(20,35) for i in range(120)]
fig=plt.figure(figsize=(40,10),dpi=80)
# 调整x的刻度
_xticks_labels=["10点{}分".format(i) for i in range(60)]
_xticks_labels+=['11点{}分'.format(i) for i in range(60)]
plt.xticks(list(x)[::3],_xticks_labels[::3],rotation=90)
# rotation表示旋转的角度
plt.yticks(range(20,36))
##添加描述信息
plt.xlabel("时间")
plt.ylabel("温度 单位(℃)")
plt.title("10点到12点每分钟的气温变化情况")
plt.plot(x,y)
plt.show()

练习:
假设在30岁的时候,根据自己的实际情况,统计出了从11岁到30岁每年的(男)女性朋友数量,请绘制出该数据的折线图。
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=["SimHei"]
matplotlib.rcParams['axes.unicode_minus']=False
y=[1,0,1,1,2,4,3,2,4,4,5,6,5,4,3,3,1,1,1]
x=range(11,30)
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
_yticks_labels=range(0,6)
_xticks_labels=["{}岁".format(i) for i in range(11,30)]
plt.xticks(x,_xticks_labels,rotation=90)
plt.yticks(_yticks_labels)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("11到30岁每年女朋友个数变化")
plt.show()

在图形中绘制网格
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=["SimHei"]
matplotlib.rcParams['axes.unicode_minus']=False
y=[1,0,1,1,2,4,3,2,4,4,5,6,5,4,3,3,1,1,1]
x=range(11,30)
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
_yticks_labels=range(0,6)
_xticks_labels=["{}岁".format(i) for i in range(11,30)]
plt.xticks(x,_xticks_labels,rotation=90)
plt.yticks(_yticks_labels)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("11到30岁每年女朋友个数变化")
plt.grid(alpha=0.4) # 网格的线条和x轴和y轴的刻度对应,稀疏程度与之一致,alpha表示网格的透明度
plt.show()

绘制两条折线图并添加图例
在这里讲一下plt.plot()
里面的参数,plt.plot(x,y,color="blue",linestyle="--",linewidth=5,alpha=0.5)
,其中x和y表示两坐标轴的变量,color
表示线条的颜色,linestyle
表示线条的风格,linewidth
表示线条的宽度,alpha
表示线条的透明度。
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=["SimHei"]
matplotlib.rcParams['axes.unicode_minus']=False
y=[1,0,1,1,2,4,3,2,4,4,5,6,5,4,3,3,1,1,1]
x=range(11,30)
y2=[1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,2,1,1,2]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y,label="myself")
plt.plot(x,y2,label="other")
_yticks_labels=range(0,6)
_xticks_labels=["{}岁".format(i) for i in range(11,30)]
plt.xticks(x,_xticks_labels,rotation=90)
plt.yticks(_yticks_labels)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("11到30岁每年女朋友个数变化")
plt.grid(alpha=0.4) # alpha表示网格的透明度
#添加图例
plt.legend(loc="upper left") # 参数loc设置图例所在的位置
plt.show()

在图中做文本标注
常用的有text
和annotate
方法,text
为五指向型标注,标注仅包含注释的文本内容,annotate
为指向型标注,标注不仅包含注释的文本内容,还包含箭头指向,能够突出细节
plt.text(x,y,s,fontdict=None,**kwargs)
-
x,y
表示文本在绘图区域中的位置 -
s
为标注的文本内容 -
fontdict
为文本属性字典 -
**kwargs
可以使用键值对的形似替换fontdict
中的文本属性
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=["SimHei"]
matplotlib.rcParams['axes.unicode_minus']=False
y=[1,0,1,1,2,4,3,2,4,4,5,6,5,4,3,3,1,1,1]
x=range(11,30)
y2=[1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,2,1,1,2]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y,label="myself",color="blue")
plt.plot(x,y2,label="other",color="red")
_yticks_labels=range(0,6)
_xticks_labels=["{}岁".format(i) for i in range(11,30)]
plt.xticks(x,_xticks_labels,rotation=90)
plt.yticks(_yticks_labels)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("11到30岁每年女朋友个数变化")
plt.grid(alpha=0.4) # alpha表示网格的透明度
#文本标注text
plt.text(22,6,r'max value',fontdict={
'family':'Times New Roman',#标注文本字体
'fontsize':20, #文本大小
'fontweight':'bold', #字体粗细
'fontstyle':'italic', #字体风格
'color':'blue', # 文本颜色
'backgroundcolor':'blue' ,#背景颜色
'bbox':{'boxstyle':'round'}
})
plt.text(12,3,r'max value',fontdict={
'family':'Times New Roman',#标注文本字体
'fontsize':20, #文本大小
'fontweight':'bold', #字体粗细
'fontstyle':'italic', #字体风格
'color':'red', # 文本颜色
'backgroundcolor':'blue' ,#背景颜色
'bbox':{'boxstyle':'round'}
})
#添加图例
plt.legend(loc="upper left") # 参数loc设置图例所在的位置
plt.show()

plt.anotate(s,xy,*args,**kwargs)
-
s
为标注的文本内容 -
xy
为标注箭头的开始坐标(x,y)
-
*args
为xytext=(x,y)
标注文本的坐标 -
** kwaargs
主要为字典类型的arrowprops
参数和键值对形式的fontdict
中的任何参数,fontdict
中的参数和plt.text()
中的一致
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=["SimHei"]
matplotlib.rcParams['axes.unicode_minus']=False
y=[1,0,1,1,2,4,3,2,4,4,5,6,5,4,3,3,1,1,1]
x=range(11,30)
y2=[1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,2,1,1,2]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y,label="myself",color="blue")
plt.plot(x,y2,label="other",color="red")
_yticks_labels=range(0,6)
_xticks_labels=["{}岁".format(i) for i in range(11,30)]
plt.xticks(x,_xticks_labels,rotation=90)
plt.yticks(_yticks_labels)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("11到30岁每年女朋友个数变化")
plt.grid(alpha=0.4) # alpha表示网格的透明度
#文本标注text
# plt.text(22,6,r'max value',fontdict={
# 'family':'Times New Roman',#标注文本字体
# 'fontsize':20, #文本大小
# 'fontweight':'bold', #字体粗细
# 'fontstyle':'italic', #字体风格
# 'color':'blue', # 文本颜色
# 'backgroundcolor':'blue' ,#背景颜色
# 'bbox':{'boxstyle':'round'}
# })
#
# plt.text(12,3,r'max value',fontdict={
# 'family':'Times New Roman',#标注文本字体
# 'fontsize':20, #文本大小
# 'fontweight':'bold', #字体粗细
# 'fontstyle':'italic', #字体风格
# 'color':'red', # 文本颜色
# 'backgroundcolor':'blue' ,#背景颜色
# 'bbox':{'boxstyle':'round'}
# })
plt.annotate(r'$max value$',xy=(13,3),xytext=(12,4),
arrowprops={
'headwidth':10, #箭头头部的宽度
'headlength':5, #箭头头部的长度
'width':4,#箭头尾部的宽度
'facecolor':'b',#箭头的颜色
'shrink':0.1 #从箭尾到标注文本内容开始两端空隙长度
},
family='Times New Roman', #标注文本字体
fontsize=18, #文本大小
fontweight='bold',#文本为粗体
color="blue", #文本颜色
ha='center' #水平居中 )
)
plt.annotate(r'$max value$',xy=(22,6),xytext=(22,4),
arrowprops={
'headwidth':10, #箭头头部的宽度
'headlength':5, #箭头头部的长度
'width':4,#箭头尾部的宽度
'facecolor':'b',#箭头的颜色
'shrink':0.1 #从箭尾到标注文本内容开始两端空隙长度
},
family='Times New Roman', #标注文本字体
fontsize=18, #文本大小
fontweight='bold',#文本为粗体
color="blue", #文本颜色
ha='center' #水平居中 )
)
#添加图例
plt.legend(loc="upper left") # 参数loc设置图例所在的位置
plt.show()

以上文本添加参考了知乎[2]
参考资料
csdn博文: https://blog.csdn.net/qq_17753903/article/details/86260276
[2]知乎参考内容: https://zhuanlan.zhihu.com/p/210951194
作者介绍
逐
逐禅
V1