逐禅

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,35for 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,35for 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()

image-20220910144457381
image-20220910144457381

上面所用的方法是作用在全局范围的,将所有字体都设置为黑体,如果相对图表中的不同部分采用个性化设置,可以用'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,35for 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()
练习1
练习1

在图形中绘制网格

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()
两条折线和图例
两条折线和图例

在图中做文本标注

常用的有textannotate方法,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()
text非指向文本添加
text非指向文本添加

plt.anotate(s,xy,*args,**kwargs)

  • s为标注的文本内容
  • xy为标注箭头的开始坐标(x,y)
  • *argsxytext=(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()
annotate指向文本添加
annotate指向文本添加

以上文本添加参考了知乎[2]

参考资料

[1]

csdn博文: https://blog.csdn.net/qq_17753903/article/details/86260276

[2]

知乎参考内容: https://zhuanlan.zhihu.com/p/210951194

分类:

人工智能

标签:

数据挖掘

作者介绍

逐禅
V1