可视化笔记1--matplotlib 常见图形绘制1
最近需要使用python实现部分数据的可视化,于是简单学习了下matplotlib绘图功能,基本包括:散点图、折线图、条形图、直方图、饼状图、箱形图等几种常用图形的绘制方式,相应学习笔记分享在此处,以便于后续参考。后续若有新功能函数,也会在此处加以补充!
1 环境搭建及小试牛刀
1.1 环境搭建
使用pip安装matplotlib
pip install matplotlib
1.2 绘制一条直线和折线
源代码如下:
import matplotlib.pyplot as plt
plt.plot([1,2,3],[3,2,1]) #第一维度为[x轴线坐标],第二维度为y轴坐标
plt.show() #直线
plt.plot([1,2,3],[-3,2,1])#斜线,(2,2)为拐点
plt.show()
结果如下:
2 Numpy简介及小试牛刀
2.1 从python基础对象转化
print('Test1!')
testList = [1,2,3,4]
testNP = np.array(testList)
print(testNP)
#结果
Test1!
[1 2 3 4]
2.2 通过numpy内生的函数生成
print('\nTest2!')
testNP2 = np.arange(11)
print(testNP2)
#结果
Test2!
[ 0 1 2 3 4 5 6 7 8 9 10]
2.3 从硬盘(文件)读取
print('\nTest3!')
testNP3 = np.loadtxt('Test.csv',delimiter=',',skiprows=0,usecols=(1,3,5))
# skiprows 是否去掉前n行
print(testNP3.shape) #查看其维度
print(testNP3)
col1,col2,col3 = np.loadtxt('Test.csv',delimiter=',',skiprows=0,usecols=(1,3,5),unpack=True)
#unpack 可以将不同列放在不同的变量中
print(col1.shape,col2.shape,col3.shape)
#结果
Test3!
(9, 3)
[[1.92186580e-02 7.39918324e-01 6.92739011e+00]
[2.93760812e-01 1.13097913e+01 3.67413910e+01]
[1.96236090e-02 7.55508963e-01 6.90509116e+00]
[1.93349450e-02 7.44395396e-01 6.97014908e+00]
[1.93088890e-02 7.43392210e-01 7.13731147e+00]
[1.98447450e-02 7.64022700e-01 7.15860926e+00]
[1.94200260e-02 7.47671001e-01 7.07135229e+00]
[2.08050220e-02 8.00993342e-01 7.64157691e+00]
[2.07637100e-02 7.99402824e-01 7.49041704e+00]]
(9,) (9,) (9,)
2.4 创建切片
print('\nTest4!')
testNP4 = np.arange(11)
print(testNP4[0])
print(testNP4[:])
print(testNP4[:5])
print(testNP4[:5])
print(testNP4[::2]) #第一个:表示整个数组,第二个表示步长为2
print(testNP4[::-1]) #逆序
#结果
Test4!
0
[ 0 1 2 3 4 5 6 7 8 9 10]
[0 1 2 3 4]
[0 1 2 3 4]
[ 0 2 4 6 8 10]
[10 9 8 7 6 5 4 3 2 1 0]
2.5 常用函数
#1) np.funcName(x)
print('\nTest5!')
testNP5 = np.random.randint(1,100,10) #在1-100之间创建10个随机数
print(testNP5)
print(np.max(testNP5),' == ',testNP5.max())
#2) 排序
y = np.sort(testNP5) #未改变原数组
print(y,'\n',testNP5)
y= testNP5.sort() #改变原数组
print(testNP5)
#结果
Test5!
[46 61 31 11 78 71 40 2 30 85]
85 == 85
[ 2 11 30 31 40 46 61 71 78 85]
[46 61 31 11 78 71 40 2 30 85]
[ 2 11 30 31 40 46 61 71 78 85]
3 散点图
散点图一般可以用于眼见两种变量的相关性,正相关、负相关、无明显相关性
import以下库
import matplotlib.pyplot as plt
import numpy as np
3.1 身高体重图
heigh = [161,172,188,175,173,165]
weight = [50,58,80,70,69,55]
plt.scatter(heigh,weight)
plt.show()
3.2 无相关性
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x,y)
plt.show()
3.3 正相关
x = np.random.randn(1000)
y = x+np.random.randn(1000)*0.5
plt.scatter(x,y)
plt.show()
3.4 负相关
x = np.random.randn(1000)
y = -x+np.random.randn(1000)*0.5
plt.scatter(x,y)
plt.show()
3.5 外观调整
x = np.random.randn(200)
y = np.random.randn(200)
plt.scatter(x,-y,alpha=0.5)
plt.scatter(x,y,s=50,c='r',marker="^",alpha=0.5)
#s 表示点面积大小,
#c 表示颜色
# marker 点的样式,参考 https://matplotlib.org/api/markers_api.html?highlight=marker#module-matplotlib.markers
# alpha 透明度调整,重叠部分透明度会增加,若值为1则无法看到透明度叠加情况
plt.show()
4 折线图
折线图是用直线将数据连接起来构成的图形,常用来观察数据随时间变化的趋势,例如股价、温度变化等。
import以下库
import matplotlib.pyplot as plt
import numpy as np
4.1 普通折线图
x=np.linspace(-10,10,100) #在-10到10之间平均分为100份
y=x**2
plt.plot(x,y)
plt.show()
x=np.linspace(-10,10,8) #在-10到10之间平均分为8份
y=x**2
plt.plot(x,y)
plt.show()
4.2 横坐标为时间
x = ['01/04/2019', '02/04/2019','03/02/2019', '04/03/2019', '05/04/2019', '06/04/2019', '07/04/2019', '08/04/2019', '09/05/2019', '10/05/2019']
y = np.random.randint(1,10,len(x))
plt.plot_date(x,y,'-') #plt.plot_date(x,y)默认为点图,'-'为线图
plt.show()
4.3 参数调节
x = ['01/04/2019', '02/04/2019','03/02/2019', '04/03/2019', '05/04/2019', '06/04/2019', '07/04/2019', '08/04/2019', '09/05/2019', '10/05/2019']
y = np.random.randint(1,10,len(x))
plt.plot_date(x,y,linestyle='--',c='r',marker='^') #默认为点图,'--'为虚线图
plt.plot_date(x,y+2,fmt='-g^') #fmt表示方式
#fmt = '[color][marker][line]' 参考文献:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot
#可以调整其linestyle、c、marker参数,也可以调整其fmt参数
plt.show()
5 条形图
条形图以长方形的长度为变量来统计图表,可用于比较多个项目分类的数据大小,常用于较小的数据集分析,例如产品季度销量、不同国家人口等
import以下库
import matplotlib.pyplot as plt
import numpy as np
5.1 垂直条形图
x = np.arange(5)
y = [20,10,30,25,15]
plt.bar(x=x,height=y,color='r',width=0.5)
plt.show()
5.2 水平条形图
x = np.arange(5)
y = [20,10,30,25,15]
plt.bar(x=0,bottom=x,color='r',width=y,height=0.5,orientation='horizontal')
#plt.barh(y=x,color='r',width=y,height=0.5) #上面方式的等价函数
plt.show()
5.3 并列条形图
bar_width=0.3
x_ = np.arange(4)
y1 = [52,55,63,53]
y2 = [44,66,55,41]
plt.bar(x=x_,height=y1,color='b',width=bar_width)
plt.bar(x=x_+bar_width,height=y2,color='r',width=bar_width)
#同理需要三个并列,则需要添加2倍的bar_width
plt.show()
5.4 层叠图
bar_width=0.5
x_ = np.arange(4)
y1 = [52,55,63,53]
y2 = [44,66,55,41]
plt.bar(x=x_,height=y1,color='b',width=bar_width)
plt.bar(x=x_,height=y2,color='r',width=bar_width,bottom=y1) #添加bottom参数即可实现层叠图
plt.show()
6 直方图
直方图有一系列高度不等的条形组成,表示数据分布的情况,如公司人员身高分布。直方图表示的数据可具有连续性,而条形图一般类别固定且不一定有连续性。
import以下库
import matplotlib.pyplot as plt
import numpy as np
6.1 普通直方图
mn=100 #平均值为100
sigma = 20 #标准差为20
x = mn +sigma*np.random.randn(2000)
plt.hist(x,bins=10,density=True)
#density/normed 是否要对数据标准化,True后纵坐标即为对应的频率
plt.show()
6.2 直方图参数调节
mn=100 #平均值为100
sigma = 20 #标准差为20
x = mn +sigma*np.random.randn(2000)
plt.hist(x,bins=50,color='r',density=False)
#density/normed 是否要对数据标准化,True后纵坐标即为对应的频率
#bins 设置直方数量
plt.show()
6.3 双变量直方图
#使用颜色深浅表示其频率,频率越高其亮度越亮,常用于分析双变量的联合分布情况
x=np.random.randn(1000)+2 #x的重心在2
y=np.random.randn(1000)+3 #y的重心在3
plt.hist2d(x,y,bins=40)
plt.show()
7 饼状图
饼状图主要用于显示一系列数据中各项大小和比例,每个数据显示展整个饼状图的百分比。
import以下库
import matplotlib.pyplot as plt
import numpy as np
7.1 基础饼状图
labels =['A','B','C','D']
y = [15,20,25,40]
plt.pie(x=y,labels=labels,autopct='%.0f%%')
#autopct 显示所占百分比
#explode 用于对某块进行突出显示
plt.show()
7.2 参数调节
labels =['A','B','C','D']
y = [15,20,25,40]
explode=[0,0.05,0.08,0]
plt.pie(x=y,labels=labels,autopct='%.0f%%',explode=explode,shadow=True)
#autopct 显示所占百分比
#explode 用于对某块进行突出显示
#shadow 添加阴影
plt.show()
8 箱形图
箱形图又称盒须图、盒式图或者箱线图,式一种用作显示一组数据分散情况资料的统计图。其包括四种值,在图上显示为:上边缘,上四分位数、中位数、下四分位数,下边缘,异常值。
import以下库
import matplotlib.pyplot as plt
import numpy as np
8.1 基础箱形图
np.random.seed(100)
data = np.random.normal(size=1000,loc=0,scale=1)
plt.boxplot(data)
plt.show()
8.2 参数调节
# np.random.seed(100)
data = np.random.normal(size=1000,loc=0,scale=1)
plt.boxplot(data,sym='.',whis=0.5)
#sym 设置异常值的形状
#whis default = 1.5,值为浮点数,其大小可以调整其上/下边缘到上/下四分位的距离
plt.show()
data = np.random.normal(size=1000,loc=0,scale=1)
plt.boxplot(data,sym='.',whis=2.5)
#sym 设置异常值的形状
#whis default = 1.5,值为浮点数,其大小可以调整其上/下边缘到上/下四分位的距离
plt.show()
说明
以上默认测试python版本为python3.6.3,matplotlib 3.0.0