[Python从零到壹] 十七.可视化分析之MatplotlibPandasEcharts入门万字详解
Posted Eastmount
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 十七.可视化分析之MatplotlibPandasEcharts入门万字详解相关的知识,希望对你有一定的参考价值。
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
前一篇文章讲述了数据预处理、Jieba分词和文本聚类知识,这篇文章主要介绍Matplotlib和Pandas扩展包绘图的基础用法,同时引入Echarts技术,该技术主要应用于网站可视化展示中。本文内容以实例为主,给读者最直观的图形感受。两万字基础文章,希望对您有所帮助。
文章目录
下载地址:
前文赏析:
第一部分 基础语法
- [Python从零到壹] 一.为什么我们要学Python及基础语法详解
- [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
第二部分 网络爬虫
- [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
- [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
- [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解
- [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
- [Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解
- [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
- [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)
第三部分 数据分析和机器学习
- [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
- [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
- [Python从零到壹] 十三.机器学习之聚类分析万字总结全网首发(K-Means、BIRCH、层次聚类、树状聚类)
- [Python从零到壹] 十四.机器学习之分类算法三万字总结全网首发(决策树、KNN、SVM、分类算法对比)
- [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
- [Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
- [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
第四部分 Python图像处理
第五部分 NLP与文本挖掘
第六部分 人工智能入门知识
第七部分 图像识别与目标检测
第八部分 网络攻防与AI安全
第九部分 知识图谱构建实战
第十部分 人工智能高级案例
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
可视化技术是将数据转换成图形或图像呈现在屏幕上,再进行视觉交互。在数据分析中,可视化是非常重要的环节,它通过呈现图形图像直观的体现数据或算法的好坏,给读者最直观的视觉信息。
一.Matplotlib可视化分析
基础用法参考前文:
1.绘制曲线图
首先简单地绘制三条直线,其斜率分别为0.5、1.5和3.0,完整代码如下:
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(0,4)
print(X)
plt.plot(X, X*0.5, label="y=x*0.5")
plt.plot(X, X*1.5, label="y=x*1.5")
plt.plot(X, X*3.0, label="y=x*3.0")
plt.legend()
plt.show()
输出如图所示,其中X为数组[0,1,2,3],X×0.5表示数组元素都乘以0.5,其结果为:[0,0.5,1.0,1.5],同理X×1.5结果为:[0.0,1.5,3.0,4.5]。
- import matplotlib.pyplot as plt
表示调用Matplotlib子类pyplot绘图,并as重命名为plt,方便代码调用。 - plt.plot(X, X0.5, label="y=x0.5")
表示调用plot()绘图,参数分别为X坐标、Y坐标和标签label。 - plt.legend()
显示右上角的图标,每条线对应label的含义。 - plt.show()
最后调用该函数显示绘制好的图形。
下面将上图绘制成不同类型的线条。核心修改代码如下:
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(0,4)
print(X)
plt.plot(X, X*0.5, "r-", label="y=x*0.5")
plt.plot(X, X*1.5, "y--", label="y=x*1.5")
plt.plot(X, X*3.0, "g:", label="y=x*3.0")
plt.legend()
plt.show()
其中,"r-"表示红色直线,"y–"表示黄色虚线,"g:"表示绿色点线,输出如图所示。
但是上图绘制的图形有点细,怎么解决呢?设置参数linewidth=2.0即可,参考下面的代码,Matplotlib绘制sin函数和cos函数曲线。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi,np.pi,256,endpoint=True)
C = np.cos(X)
S = np.sin(X)
plt.plot(X, C, color="blue", linewidth=2.0, linestyle="-", label="$sin(x)$")
plt.plot(X, S, color="red", linewidth=2.0, linestyle="--", label="$cos(x)$")
plt.legend()
plt.show()
代码 np.linspace(-np.pi,np.pi,256,endpoint=True) 表示输出负π(-np.pi)到正π(np.pi)范围,然后调用numpy库的cos()函数和sin()函数计算C值和S值,最后调用plt.plot()绘制直线图,plot()函数中的参数含义如下:
- X:横坐标或X坐标值
- C\\S:纵坐标或Y坐标值,设置为C值和S值
- color:直线的颜色,blue表示蓝色、red报表时红色,可以简写如"r"
- linewidth:绘制线条的粗细程度
- linestyle:设置线条的款式,-表示直线、–表示虚线、:表示点线、-.表示点划线
- label:设置绘制曲线的标签
输出如图所示。
最后,感兴趣的同学可以绘制自己喜欢的曲线,下面代码是绘制浪漫的心形函数(笛卡尔曲线)。Python可视化分析可以应用于更多的曲线绘制,比如在数据拟合、回归分析、数学分析等领域绘制曲线。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-8 , 8, 1024)
y1 = 0.618*np.abs(x) - 0.8* np.sqrt(64-x**2)
y2 = 0.618*np.abs(x) + 0.8* np.sqrt(64-x**2)
plt.plot(x, y1, color = 'r')
plt.plot(x, y2, color = 'r')
plt.show()
输出如图所示:
2.绘制散点图
Python调用Matplotlib绘制散点图有两种方法,一种是调用scatter()函数实现,另一种方法是调用plot()函数实现,这里主要讲述scatter()函数绘制散点图的方法。从给出的一堆随机点(包含x、y坐标)中调用scatter()绘制散点图,代码如下。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
#构造数据
x = np.random.randn(200)
y = np.random.randn(200)
print(x[:10])
print(y[:10])
#绘制散点图
plt.scatter(x, y)
plt.show()
numpy中有一些用来产生随机数的常用函数,randn()和rand()就属于其中。
- numpy.random.randn(d0, d1, …, dn):从标准正态分布中返回一个或多个样本值。
- numpy.random.rand(d0, d1, …, dn):产生随机样本,并且数字位于[0, 1]中。
代码中产生了200个服从标准正态分布的随机样本点,对应x数组和y数组,前10行输出如下:
[-0.94086693 -0.92910167 -0.83885859 -0.50927277 2.12230463 0.45695791
-0.59766636 -0.62862962 0.28245908 1.46415206]
[ 0.43828148 0.76547797 1.18670217 0.31996158 0.00350372 1.02620566
3.04573837 -0.59712547 0.45061506 -1.63996253]
产生的200个随机散点图如图所示。
为了区分点,scatter()提供了参数设置不同点的颜色及大小,其中s参数指定大小,c参数指定颜色,随机为这200个点分配不同的大小及颜色,代码如下。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
#构造数据
x = np.random.randn(200)
y = np.random.randn(200)
print(x[:10])
print(y[:10])
size = 50*np.random.randn(200)
colors = np.random.rand(200)
#绘制散点图
plt.scatter(x, y, s=size, c=colors)
plt.show()
输出如图所示。
在进行聚类、分类分析中,通常会将不同类型的数据标识成一组(类标),而对应的可视化操作也是将散点图绘制成不同的颜色或形状。下面代码即是分成三种不同类型的点集。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
#随机产生90个二维数组
x = np.random.rand(90,2)
print(x)
#numpy中ones()用来构造全一矩阵
label = list(np.ones(40))+list(2*np.ones(30))+list(3*np.ones(20)) #类标label为1、2、3
label = np.array(label)
print(label)
print(type(label))
idx1 = np.where(label == 1)
idx2 = np.where(label == 2)
idx3 = np.where(label == 3)
#绘图 参数:x值、y值、点样式、颜色、类标、粗细
p1 = plt.scatter(x[idx1,0], x[idx1,1], marker = 'x', color = 'r', label='1', s = 40)
p2 = plt.scatter(x[idx2,0], x[idx2,1], marker = '+', color = 'b', label='2', s = 30)
p3 = plt.scatter(x[idx3,0], x[idx3,1], marker = 'o', color = 'c', label='3', s = 20)
plt.legend(loc = 'upper right')
plt.show()
输出如图所示。
代码中调用np.random.rand(90,2)函数随机成才90个二维数组,分别对应90个点,其中x[indx1,0]表示获取第一维坐标作x轴,x[indx1,1]表示获取第二维坐标作y轴。然后调用np.ones()函数构造全是1的矩阵,生成的变量label对应90个点的类标,前40个点类标为1、中间30个点类标为2、最后20个点类标为3。最后调用plt.scatter()函数绘制散点图,即:
- plt.scatter(x[idx1,0], x[idx1,1], marker = ‘x’, color = ‘r’, label=‘1’, s = 40)
代码表示绘制类标(label)为1的散点,其他参数包括x值和y值,设置点样式(marker= ‘x’)为叉形,设置颜色(color = ‘r’)为红色,粗细为40。
这部分主要讲述了scatter()函数绘制散点图,后面的聚类和分类分析中也会讲解另一种方法plot()绘制散点图。
3.绘制柱状图
柱状图主要用于直观的对比统计数据,是常用的一种数学统计图形。下列代码是产生四个用户的随机月消费数据,然后调用bar()函数绘制图形。代码如下:
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import numpy as np
import matplotlib.pyplot as plt
#随机产生4个整数(0到100之间)
data = np.random.randint(0,100,4)
print(data)
ind = np.arange(4) #四个用户
print(ind)
width = 0.35 #设置宽度
x = ['UserA', 'UserB', 'UserC', 'UserD']
plt.bar(ind, data, width, color='green', label='Data')
plt.xlabel("Username")
plt.ylabel("Consumption")
plt.title("Compare four user monthly consumption data")
plt.legend()
plt.xticks(ind+width/2, x, rotation=40) #旋转40度
plt.show()
核心代码详解如下:
- np.random.randint(0,100,4)
随机生成0到100之间的4个随机数,输出为[3 66 98 42]。 - plt.bar(ind, data, width, color=‘green’, label=‘Data’)
调用bar()函数绘制柱状图,其中ind表示用户的序号,0到3共四个用户;data表示柱状图对应的高度或值;width设置柱状图之间的间隔宽度,即0.35;最后设置颜色类标。 - plt.xticks(ind+width/2, x, rotation=40)
设置X轴坐标值的位置和旋转度数,ind+width/2表示间隔中间的位置显示标签,显示的值为四个用户名[UserA, UserB, UserC, UserD],并且旋转40度。
其他设置标题、X轴、Y轴前面已经叙述,这里不再解释。最后输出如图所示。
下图是柱状图的扩展版,它是对学习、旅游、看剧、聊天四个选项男女比例的对比。采用np.array()定义数组,然后根据男女比例进行绘图。完整代码如下:
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import matplotlib.pyplot as plt
import numpy as np
num = np.array([1342, 6092, 4237, 8219]) #数量
ratio = np.array([0.75, 0.76, 0.72, 0.75]) #男性占比
men = num * ratio
women = num * (1-ratio)
x = ['学习',u'旅游',u'看剧',u'聊天']
plt.rc('font', family='SimHei', size=13) #中文字体显示
width = 0.5
idx = np.arange(4)
plt.bar(idx, men, width, color='red', label='男性用户')
plt.bar(idx, women, width, bottom=men, color='yellow', label='女性用户')
plt.xticks(idx+width/2, x, rotation=40)
plt.legend()
plt.show()
输出如图所示。
4.绘制饼图
绘制饼图主要调用plt.pie()函数实现,这里仅举个简单示例供大家学习,输出下图所示。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
import matplotlib.pyplot as plt
#每一块占得比例,总和为100
mm = [45, 30, 25]
n = mm[0]+mm[1]+mm[2]
a = (mm[0]*1.0*100/n)
b = (mm[1]*1.0*100/n)
c = (mm[2]*1.0*100/n)
fracs = [a, b, c]
print(a, b, c, n)
#离开整体的距离
explode=(0, 0, 0.08)
labels = 'A', 'B', 'C'
#绘制图形
plt.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90, colors = ("c", "r", "y"))
plt.show()
首先计算a、b、c所占mm的比例,输出值为[45.0, 30.0, 25.0]。接下来:
- 调用plt.pie()绘制饼状图,参数fracs表示占比;
- explode表示离开整体圆形的距离,比如C离开了0.08的距离;
- labels表示类标;autopct=’%1.1f%%'表示显示的数据保留一位小数;
- shadow=True表示图形存在阴影;
- startangle表示开始的角度,默认值为0。
从此处开始按逆时针方向依次展开显示A、B、C三个板块,颜色依次为青色、红色、黄色。
5.绘制3D图形
Python调用Axes3D子类实现绘制3D图形,绘制3D坐标代码如下:
import matplotlib.pyplot as plt #绘图用的模块
from mpl_toolkits.mplot3d import Axes3D #绘制3D坐标的函数
fig1=plt.figure() #创建一个绘图对象
ax=Axes3D(fig1) #用这个绘图对象创建一个Axes对象
plt.show() #显示模块中所有绘图对象
绘制的3D坐标如图所示。
更多的3D绘图方法请读者下来研究,因为本书主要以数据2D图形可视化为主,下面的代码是一个简单绘制3D图形的实例,包含详细注释。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D # 绘制3D坐标的函数
fig = plt.figure() #创建一个绘图对象
ax = Axes3D(fig) #用这个绘图对象创建一个Axes对象
X = np.arange(-2, 2, 0.25) #X轴-2到2之间
Y = np.arange(-2, 2, 0.25) #Y轴-2到2之间
print(Y)
X, Y = np.meshgrid(X, Y) #用两个坐标轴上的点在平面上画格
R = np.sqrt(X**2 + Y**2) #X和Y的平方和开根号
Z = np.sin(R) #计算sin函数赋值为Z坐标
#具体函数方法可用 help(function) 查看,如:help(ax.plot_surface)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
#给三个坐标轴注明
ax.set_xlabel('x label', color='r')
ax.set_ylabel('y label', color='g')
ax.set_zlabel('z label', color='b')
plt.show()
输出如图所示。
二.Pandas读取文件可视化分析
本小节主要讲述Pandas读取文件进行可视化分析的常用操作。假设存在2002年到2014年北京、上海、贵阳、武汉、长沙五个城市的商品房房价信息(虚构数据),如表所示,并存储在test16.csv文件中。作者将结合Pandas扩展包对其数据集进行可视化讲解。
year Beijing Shanghai Guiyang Wuhan Changsha
2002 4764 4134 1643 1928 1802
2003 4737 5118 1949 2072 2040
2004 5020.93 5855 1801.68 2516.32 2039.09
2005 6788.09 6842 2168.9 3061.77 2313.73
2006 8279.51 7196 2372.66 3689.64 2644.15
2007 11553.26 8361 2901.63 4664.03 3304.74
2008 12418 8195 3149 4781 3288
2009 13799 12840 3762 5329 3648
2010 17782 14464 4410 5746 以上是关于[Python从零到壹] 十七.可视化分析之MatplotlibPandasEcharts入门万字详解的主要内容,如果未能解决你的问题,请参考以下文章
[Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解
[Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
[Python从零到壹] 五十七.图像增强及运算篇之图像锐化RobertsPrewitt算子实现边缘检测
[Python从零到壹] 番外篇之可视化利用D3库实现CSDN博客每日统计效果(类似github)