数据可视化--matplotlib 基础


matplotlib官网
查看具体版本

定义

数据可视化,即用图形的方式 --> 展示数据的分布规律

创建画板

plt.figure

from matplotlib import pyplot as plt

#创建一个画板,可以在上面画图
"""
fig = plt.figure(num,figsize,dpi,facecolor,edgecolor,frameon,clear)
参数:
num, 当前画板的标识id,int/str ,若不指定该参数,
则每次创建一个新画板对象,id自动增加。若指定的id
已经存在,则激活当前id的画板,否则以该id创建一个新画板

figsize,当前画板的尺寸 tuple,如: (width10,height8) 英寸
dpi,分辨率, 每英寸的像素点数  如144
facecolor,背景颜色  可以自定义设置
edgecolor,边框颜色
frameon,是否显示边框  默认True
clear, 默认False, True时创建相同id的画板时,旧的画板被清除
"""

示例

  1. 创建一个id=1的画板,尺寸 10x8,分辨率144,背景颜色浅蓝色
from matplotlib import pyplot as plt
fig = plt.figure(1,figsize=(10,8),dpi=144,facecolor="lightblue")

plt.show()

在这里插入图片描述
2. 激活id=1的画板,获取它的尺寸,背景色改为黄绿色

fig = plt.figure(1)
print(fig.number) #获取id
if fig.get_figwidth() == 10 and fig.get_figheight() == 8:
	fig.set_figwidth(8)
	fig.set_figheight(6)
	fig.set_facecolor("yellowgreen")
else:
	pass

添加坐标轴

画板增加坐标轴
fig.add_subplot(111)
fig.add_subplot(1,1,1,facecolor=“pink”)
axis1 = fig.add_subplot(1,4,1)
axis2 = fig.add_subplot(1,4,2)
axis3 = fig.add_subplot(2,2,1)

import numpy as np
import time
import logging
logging.basicConfig(level=logging.INFO,format="%(asctime)s %(message)s")
from matplotlib import pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

fig = plt.figure(1,facecolor="lightblue")

#给画板增加 坐标轴
axis = fig.add_subplot(1,1,1,facecolor="pink")
#axis = fig.add_subplot(111)

#设置标题
axis.set_title("一个坐标轴",fontsize=15,color="blue")

#设置坐标轴的标签
axis.set_xlabel("x轴",fontsize=20,color="r")
axis.set_ylabel("y轴",fontsize=20,color="g")

#设置坐标轴的上下限
axis.set_xlim(0,5)
axis.set_ylim(0,10)

#设置刻度
#p1刻度列表
#p2 minor=True显示小刻度
#minor=False 只显示主刻度
axis.set_xticks(np.arange(0,6),minor=False)

#设置刻度的标签
xticklabels = ["2016","2017","2018","2019","2020","2021"]
axis.set_xticklabels(xticklabels,{"rotation":30,"fontsize":15,\
                                  "fontweight":"bold",\
                                  "verticalalignment":"top",\
                                  "horizontalalignment":"center"})
#axis.set_yticklabels


#关闭坐标轴
axis.set_axis_off()
#开启坐标轴
axis.set_axis_on()

#设置背景色
#axis.set_facecolor("r")


#点图
axis.scatter([1,2,3],[2,3,4],s=200,c="b",marker="^",edgecolors="r",linewidths=1,label="points")

#线图
axis.plot(np.arange(6),np.random.randint(0,6,6),c="snow",linestyle="--",linewidth=2,marker="s",label="line")

#绘制网格
axis.grid(linestyle="-")

#增加图例
axis.legend(loc="upper right",frameon=True,framealpha=0.3,fontsize=15)

plt.show()

在这里插入图片描述

plt.subplot

plt.subplot(1,3,1)直接返回坐标轴

import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

from sklearn.datasets import load_iris
X,y = load_iris(return_X_y=True)

#创建画板并返回坐标轴
#面向对象的画图方式
axis1 = plt.subplot(1,3,1)
axis2 = plt.subplot(1,3,2)
axis3 = plt.subplot(1,3,3)

#使用各自的坐标轴绘图

#第一个坐标轴绘制鸢尾花
axis1.set_title("鸢尾花数据",fontsize=20,color="blue")
axis1.scatter(X[:,0],X[:,1],s=(X[:,2]+1.5)**3,edgecolors="r",linewidths=X[:,3],c=y,cmap="summer",label="鸢尾花")
axis1.set_xlabel("萼片长度",fontsize=15)
axis1.set_ylabel("萼片的宽度",fontsize=15)
axis1.grid(linestyle=":")
axis1.legend(loc="upper right",frameon=True,framealpha=0.3,fontsize=15)


#第二个坐标轴绘制波士顿房价与犯罪率的关系
from sklearn.datasets import load_boston
boston = load_boston()
X,y = boston.data,boston.target
axis2.scatter(X[:,0],y,s=100,c="r",label="周边犯罪率与房价")
axis2.set_title("波士顿犯罪率与房价的关系",fontsize=20)
axis2.set_xlabel("犯罪率",fontsize=15,color="r")
axis2.set_ylabel("房价",fontsize=15,color="r")
axis2.grid(linestyle="-")
axis2.legend(loc="upper right",frameon=True,framealpha=.3,fontsize=15)


#第三个坐标轴绘制 泰坦尼克号数据幸存者中年龄的分布
import pandas as pd
df = pd.read_csv("titanic.csv")
X = df.filter(["Age","Survived"]).values
survive_age = X[X[:,1]==1][:,0]

axis3.hist(survive_age,bins=10,label="年龄分布")

axis3.set_xlabel("年龄",fontsize=15)
axis3.set_ylabel("频数",fontsize=15)
axis3.set_title("幸存者的年龄分布",fontsize=20)

axis3.grid(linestyle=":")
axis3.legend(loc="upper right",frameon=True,framealpha=0.3,fontsize=15)


#子图之间的调整
plt.subplots_adjust(left=0.1,right=0.9,bottom=0.1,top=0.9,wspace=.3)
plt.show()

在这里插入图片描述

plt.subplots

plt.subplots 返回画板和坐标轴数组 (1dim)

fig,axes = plt.subplots(1,3)
axis1,axis2,axis3 = axes

线图

from matplotlib import pyplot as plt

plt.plot(x,y,c="r",ls="--",lw=2,label="line")
# x,y 为轴上的序列值
# c --> color "red"/rgb/rgba/
# ls -->linestyle - -- : -.
# lw -->linewidth
# label -->图例
# alpha -->不透明度

#水平线
plt.hlines(y_value,x1,x2)
#垂直线
plt.vlines(x_value,y1,y2)

练习:绘制正弦曲线

import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(-np.pi,np.pi,500)
y = np.sin(x)
plt.plot(x,y,"ro-",lw=2,label="sin")
plt.grid()
plt.legend(loc="lower right",frameon=True,framealpha=0.3,fontsize=20)

#显示中问设置
plt.rcParams["font.sans-serif"] = ["SimHei"]
#刻度负号显示
plt.rcParams["axes.unicode_minus"] = False
plt.title("正弦曲线",fontsize=24)
plt.xlabel("x 轴",fontsize=20)
plt.ylabel("y 轴",fontsize=20)

#设置刻度 值与字符串必须一一对应
value_list = [-np.pi,-np.pi*0.5,0,np.pi*0.5,np.pi]
name_list = [r"$-\pi$",r"$-\frac {\pi}{2}$",r"$0$",r"$\frac {\pi} {2}$",r"$\pi$"]
plt.xticks(value_list,name_list,fontsize=20,rotation=30)
#plt.yticks
plt.show()  #显示图形,并阻塞

问题点:
图像显示的中文字体太小

解决:
指定 fontsize = 24参数
在这里插入图片描述

设置坐标轴

#获取四面的坐标轴
ax = plt.gca()
axis_left = ax.spines["left"]
axis_right = ax.spines["right"]
axis_top = ax.spines["top"]
axis_bottom = ax.spines["bottom"]

#设置单独的一个轴
axis_left.set_position(("data",0))
axis_left.set_color("blue")
axis_bottom.set_position(("data",0))
axis_bottom.set_color("green")

axis_right.set_color("none")
axis_top.set_color("none")

在这里插入图片描述

散点图

plt.scatter(x,y,s,c,marker,edgecolors,linewidthes,zorder,label)
#x,y 每个轴上的数据序列
# s 点的大小 100 200
# c 点的颜色  -->facecolor
# marker 点的形状
# edgecolors 边缘色
# linewidths 边缘线宽
# zorder 图层编号 越大越在顶层
# label 图例

常用的marker
在这里插入图片描述
练习在正弦曲线中 标记 三个特殊点

设置备注

为某个点添加备注

plt.annotate(content,xy,xycoords="data",xytext,textcoords="offset points",fontsize,arrowprops)
#content 备注的内容
#xy 备注的点 (x,y) 真实坐标
# xycoords 该点使用的坐标系  指定”data“
# xytext 内容的位置 (offsetx,offsety) -->(30,20)
# textcoords 内容使用的坐标系  指定”offset points“
# fontsize 文本大小
# arrowprops =dict(arrowstyle="->",connectionstyle="angle3")
# ->  <->
#arc3 angle3

代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Mar  5 17:02:41 2021

@author: lenovo
"""

import numpy as np
from matplotlib import pyplot as plt

#设置显示中文
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

x = np.linspace(-np.pi,np.pi,500)
y = np.sin(x)
plt.plot(x,y,"ro-",lw=2,label="sin")


#画特殊的点
plt.scatter([np.pi*0.5,],[1,],s=200,c="g",marker="s",edgecolors="b",linewidths=1,zorder=3,label="Points")
plt.annotate(r"顶点",xy=(np.pi*0.5,1),xycoords="data",xytext=(30,20),textcoords="offset points",\
             fontsize=24,arrowprops=dict(arrowstyle="->",connectionstyle="angle3"))


#设置坐标轴
ax = plt.gca()
axis_left = ax.spines["left"]
axis_right = ax.spines["right"]
axis_top = ax.spines["top"]
axis_bottom = ax.spines["bottom"]
#设置单独的一个轴
axis_left.set_position(("data",0))
axis_left.set_color("blue")
axis_bottom.set_position(("data",0))
axis_bottom.set_color("green")

axis_right.set_color("none")
axis_top.set_color("none")

plt.grid()
plt.legend(loc="lower right",frameon=True,framealpha=0.3,fontsize=20)

plt.title("正弦曲线",fontsize=24)
plt.xlabel("x 轴",fontsize=20)
plt.ylabel("y 轴",fontsize=20)

#设置刻度
value_list = [-np.pi,-np.pi*0.5,0,np.pi*0.5,np.pi]
name_list = [r"$-\pi$",r"$-\frac {\pi}{2}$",r"$0$",r"$\frac {\pi} {2}$",r"$\pi$"]
plt.xticks(value_list,name_list,fontsize=20,rotation=30)
#plt.yticks
plt.show()  #显示图形,并阻塞

在这里插入图片描述

图形窗口

数据可视化2


版权声明:本文为weixin_45228198原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。