一、数据可视化介绍

数据可视化是指将数据放在可视环境中、进一步理解数据的技术,可以通过它更加详细地了解隐藏在数据表面之下的模式趋势相关性

Python提供了很多数据可视化的库:

  • matplotlib

pandas

matlpotlib和pandas结合

利用pandas进行数据读取、数据清洗和数据选取等操作,再使用matlpotlib显示数据。

1.matplotlib简介和简单使用

matplotlib是Python最著名的绘图库,它提供了一整套和Matlab相似的命令API,十分适合
交互式地进行制图;也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源代码。如果需要绘制某种类型的图,只需要在这个页面中进行简单的浏览、复制、粘贴,就能实现画图。

matplotlib画图的子库:

  • pyplot子库
    提供了和matlab类似的绘图API,方便用户快速绘制2D图表。
  • pylab模块
    其中包括了许多numpy和pyplot中常用的函数,方便用户快速进行计算和绘图,可以用于IPython中的快速交互式使用。

使用matplotlib快速绘图导入库和创建绘图对象如下:

import matplotlib.pyplot as pltplt.figure(figsize=(8,4))

创建绘图对象时,同时使它成为当前的绘图对象。
通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。
因此本例中所创建的图表窗口的宽度为8 * 80 = 640像素。

也可以不创建绘图对象直接调用plot方法绘图,matplotlib会自动创建一个绘图对象。
如果需要同时绘制多幅图表的话,可以给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。

pyplot画图简单使用如下:

import numpy as np
import matplotlib.pyplot as plt # 首先载入matplotlib的绘图模块pyplot,并且重命名为pltx = np.linspace(0, 10, 1000)  y = np.sin(x)
z = np.cos(x**2)plt.figure(figsize=(8,4))   #2 创建绘图对象plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$") plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()plt.show()

显示:

其中:

plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")

第一行将x、y数组传递给plot之后,用关键字参数指定各种属性:

  • label
    给所绘制的曲线取一个名字,用于在图示(legend)中显示;
    在字符串前后添加$符号,就会使用内置的latex引擎绘制数学公式。
  • color
    指定曲线的颜色:颜色可以用英文单词,或者以#字符开头的三个16进制数,例如#ff0000表示红色,或者用值在0到1范围之内的三个元素的元组表示,例如(1.0, 0.0, 0.0)也表示红色。
  • linewidth
    指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw。
  • 曲线样式
    第三个参数b--指定曲线的颜色和线型,它通过一些易记的符号指定曲线的样式,其中b表示蓝色,–表示线型为虚线。
    在IPython中输入plt.plot?可以查看格式化字符串以及各个参数的详细说明。
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()

通过一系列函数设置当前Axes对象的各个属性:

  • xlabel、ylabel
    分别设置X、Y轴的标题文字。
  • title
    设置子图的标题。
  • xlim、ylim
    分别设置X、Y轴的显示范围。
  • legend
    显示图示,即图中表示每条曲线的标签(label)和样式的矩形区域。

最后调用plt.show()显示出绘图窗口。

一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图Axes)。可以使用subplot函数快速绘制有多个轴的图表。
subplot函数的调用形式如下:

subplot(numRows, numCols, plotNum)

subplot将整个绘图区域等分为numRows行和numCols列个子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。
如果numRows、numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。
subplot在plotNum指定的区域中创建一个轴对象,如果新创建的轴和之前创建的轴重叠,之前的轴将被删除。

如下:

for idx, color in enumerate("rgbyck"):plt.subplot(320+idx+1, facecolor=color)
plt.show()

显示:

可以看到:
创建3行2列共6个轴,通过facecolor参数给每个轴设置不同的背景颜色。

如果希望某个轴占据整个行或者列的话,可以如下:

plt.subplot(221) # 第一行的左图
plt.subplot(222) # 第一行的右图
plt.subplot(212) # 第二整行
plt.show()

显示:

再举一个创建子图的例子:

plt.figure(1) # 创建图表1
plt.figure(2) # 创建图表2
ax1 = plt.subplot(211) # 在图表2中创建子图1
ax2 = plt.subplot(212) # 在图表2中创建子图2x = np.linspace(0, 3, 100)
for i in range(5):plt.figure(1) # 选择图表1plt.plot(x, np.exp(i*x/3))plt.sca(ax1) # 选择图表2的子图1   Set the current Axes instance to ax.plt.plot(x, np.sin(i*x))plt.sca(ax2) # 选择图表2的子图2plt.plot(x, np.cos(i*x))
plt.show()

显示:

首先通过figure()创建了两个图表,它们的序号分别为1和2;
然后在图表2中创建了上下并排的两个子图,并用变量ax1和ax2保存。
在循环中:
先调用figure(1)让图表1成为当前图表,并在其中绘图。
然后调用sca(ax1)和sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。
当它们成为当前子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)依次在图表1和图表2的两个子图之间切换,逐步在其中添加新的曲线即可。

其中,twinx()可以为图增加纵坐标轴,使用如下:

x = np.arange(1, 21, 0.1)y1 = x * x
y2 = np.log(x)plt.plot(x, y1)# 添加一条y轴的坐标轴
plt.twinx()
plt.plot(x, y2)plt.show()

显示:

进一步使用如下:

import numpy as np
import matplotlib.pyplot as pltx = np.arange(1, 20, 1)
y1 = x * x
y2 = np.log(x)fig = plt.figure()
ax1 = fig.add_subplot(111)ax1.plot(x, y1, label = "$y1 = x * x$", color = "r")
ax1.legend(loc = 0)
# 设置对应坐标轴的名称
ax1.set_ylabel("y1")
ax1.set_xlabel("Compare y1 and y2")# 设置x轴刻度的数量
ax = plt.gca()
ax.locator_params("x", nbins = 20)# 添加坐标轴,并在新添加的坐标轴中画y2 = log(x)图像
ax2 = plt.twinx()
ax2.set_ylabel("y2")
ax2.plot(x, y2, label = "$y2 = log(x)$")
ax2.legend(loc = 0)plt.show()

显示:

2.matplotlib常见作图类型

画图在工作中在所难免,尤其在进行数据探索时显得尤其重要,matplotlib常见的一些作图种类如下:

  • 散点图
  • 条形图
  • 饼图
  • 三维图

先导入库和基础配置如下:

from __future__ import division
from numpy.random import randn
import numpy as np
import os
import matplotlib.pyplot as plt
np.random.seed(12345)
plt.rc('figure', figsize=(10, 6))
from pandas import Series, DataFrame
import pandas as pd
np.set_printoptions(precision=4)get_ipython().magic(u'matplotlib inline')
get_ipython().magic(u'pwd')

打印:

'XXX3_Visualization_Of_Data_Analysisbasicuse'

基础画图如下:

# matplotlib创建图表
plt.plot([1,2,3,2,3,2,2,1])
plt.show()plt.plot([4,3,2,1],[1,2,3,4])
plt.show()

显示:

画三角函数曲线如下:

# 画简单的图形
from pylab import *
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
c,s=np.cos(x),np.sin(x)
plot(x,c, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plot(x,s,color="red", linewidth=2.5, linestyle="-", label="sine")
show()

显示:

画散点图如下:

# 散点图
from pylab import *
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
scatter(X,Y)
show()

显示:

画条形图如下:

#条形图
from pylab import *
n = 12
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
for x,y in zip(X,Y1):text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
ylim(-1.25,+1.25)
show()

显示:

饼图如下:

#饼图
from pylab import *
n = 20
Z = np.random.uniform(0,1,n)
pie(Z)
show()

显示:

画立体图如下:

#画三维图
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from pylab import *
fig=figure()
ax=Axes3D(fig)
x=np.arange(-4,4,0.1)
y=np.arange(-4,4,0.1)
x,y=np.meshgrid(x,y)
R=np.sqrt(x**2+y**2)
z=np.sin(R)
ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap='hot')
show()

显示:

画其他简单图形如下:

#更多简单的图形
x = [1,2,3,4]
y = [5,4,3,2]plt.figure()
plt.subplot(2,3,1)
plt.plot(x, y)plt.subplot(232)
plt.bar(x, y)plt.subplot(233)
plt.barh(x, y)plt.subplot(234)
plt.bar(x, y)
y1 = [7,8,5,3]
plt.bar(x, y1, bottom=y, color = 'r')plt.subplot(235)
plt.boxplot(x)plt.subplot(236)
plt.scatter(x,y)plt.show()

显示:

3.使用pandas画图

pandas中画图的主要类型包括:

  • 累和图
  • 柱状图
  • 散点图
  • 饼图
  • 矩阵散点图

先导入所需要的库:

from __future__ import division
from numpy.random import randn
import numpy as np
import os
import matplotlib.pyplot as plt
np.random.seed(12345)
from pandas import Series, DataFrame
import pandas as pd
%matplotlib inline

在pandas中,有行标签、列标签和分组信息等,如果使用matplotlib画图,可能需要一大堆的代码,现在调用Pandas的plot()方法即可简单实现。

画简单线图如下:

#线图
s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
plt.show()

显示:

pandas.Series.plot()的常见参数及说明如下:

参数说明参数说明label用于图例的标签ax要在其上进行绘制的matplotlib subplot对象,如果没有设置,则使用当前matplotlib subplotstyle将要传给matplotlib的风格字符串,例如'ko-'alpha图表的填充不透明(0-1)kind可以是'line'、'bar'、'barh'、'kde'logy在Y轴上使用对数标尺use_index将对象的索引用作刻度标签rot旋转刻度标签(0-360)xticks用作X轴刻度的值yticks用作Y轴刻度的值xlimX轴的界限ylimY轴的界限grid显示轴网格线

Pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象,从而能够在网络布局中更为灵活地处理subplot的位置。DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例。

画多列线图如下:

df = DataFrame(np.random.randn(10, 4).cumsum(0),columns=['A', 'B', 'C', 'D'],index=np.arange(0, 100, 10))
df.plot()
plt.show()

显示:

相对于Series,DataFrame还有一些用于对列进行灵活处理的选项,例如要将所有列都绘制到一个subplot中还是创建各自的subplot等,具体如下:

画简单累和图如下:

#线图 CUM
plt.close('all')s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
plt.show()

显示:

画多列的类和图如下:

df = DataFrame(np.random.randn(10, 4).cumsum(0),columns=['A', 'B', 'C', 'D'],index=np.arange(0, 100, 10))
df.plot()
plt.show()

显示:

当提升了数据规模之后,累和图如下:

s = pd.Series([2, np.nan, 5, -1, 0])
print(s)print(s.cumsum())#画累和图
ts=pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000))
ts=ts.cumsum()
ts.plot()
plt.show()
df=pd.DataFrame(np.random.randn(1000,4),index=ts.index,columns=list('ABCD'))# cumulative意为累计、累积,这个函数可以返回一个累计值,经常会遇到月累计、年累计这种指标,会用这个函数
df=df.cumsum()
df.plot()
plt.show()

打印:

0    2.0
1    NaN
2    5.0
3   -1.0
4    0.0
dtype: float64
0    2.0
1    NaN
2    7.0
3    6.0
4    6.0
dtype: float64

显示:

画Series柱状图如下:

#柱形图
fig, axes = plt.subplots(2, 1)
data = Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot(kind='bar', ax=axes[0], color='r', alpha=0.7)
data.plot(kind='barh', ax=axes[1], color='g', alpha=0.7)
plt.show()

显示:

DataFrame画柱状图:

df = DataFrame(np.random.rand(6, 4),index=['one', 'two', 'three', 'four', 'five', 'six'],columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))df.plot(kind='bar') #图例plt.figure()df.plot(kind='barh', stacked=True, alpha=0.5)plt.show()

显示:

可以看到:
对于DataFrame,柱形图会将每一行的值分为一组;
DataFrame的各列名称都被用作了图例的标题;
设置stacked=True即可为DataFrame生成堆积柱形图,这样每行的值就会被堆积在一起。

餐馆小费数据如下:

此教程太长了,需要完整教程或者视频教程点击:源码教程

数据窗口 label_Python实现数据可视化,让你的数据清晰起来!相关推荐

  1. pb 修改数据窗口种指定字段位置_如何在PB数据窗口中修改数据---设置数据窗口的更新属性...

    如何在 PB 数据窗口中修改数据 --- 设置数据窗口的更新属性 数据窗口对象非常强大的原因之一就是能够很容易地修改数据库.当用户修 改了数据窗口中的数据,插入了新的数据行或者删除了数据行以后,只要调 ...

  2. R语言使用pcauchy函数生成柯西分布累积分布函数数据、使用plot函数可视化柯西分布累积分布函数数据(Cauchy distribution)

    R语言使用pcauchy函数生成柯西分布累积分布函数数据.使用plot函数可视化柯西分布累积分布函数数据(Cauchy distribution) 目录

  3. R语言使用qcauchy函数生成柯西分布分位数函数数据、使用plot函数可视化柯西分布分位数函数数据(Cauchy distribution)

    R语言使用qcauchy函数生成柯西分布分位数函数数据.使用plot函数可视化柯西分布分位数函数数据(Cauchy distribution) 目录

  4. R语言使用dgamma函数生成Gamma分布密度函数数据、使用plot函数可视化Gamma分布密度函数数据(Gamma Distribution)

    R语言使用dgamma函数生成Gamma分布密度函数数据.使用plot函数可视化Gamma分布密度函数数据(Gamma Distribution) 目录

  5. R语言使用punif函数生成均匀分布累积分布函数数据、使用plot函数可视化均匀分布累积分布函数数据(Uniform Distribution)

    R语言使用punif函数生成均匀分布累积分布函数数据.使用plot函数可视化均匀分布累积分布函数数据(Uniform Distribution) 目录

  6. R语言使用pbern函数生成伯努利分布(0-1分布)累积分布函数数据、使用plot函数可视化伯努利分布累积分布函数数据( Bernoulli distribution)

    R语言使用pbern函数生成伯努利分布(0-1分布)累积分布函数数据.使用plot函数可视化伯努利分布累积分布函数数据( Bernoulli distribution) 目录

  7. R语言使用dweibull函数生成威布尔(韦伯分布)分布密度数据、使用plot函数可视化威布尔分布密度数据(Weibull Distribution)

    R语言使用dweibull函数生成威布尔(韦伯分布)分布密度数据.使用plot函数可视化威布尔分布密度数据(Weibull Distribution) 目录

  8. pb数据窗口如何设置一列中连续相同数据的背景颜色_数据可视化 | 想轻松入门,必走这7步!...

    - 点击上方 "中国统计网" 设置⭐星标不迷路!- 数据可视化的目的,是要对数据进行可视化处理,以使得能够明确地.有效地传递信息. --Vitaly Friedman 通俗一点讲, ...

  9. 毕业设计 大数据B站数据分析与可视化 - python 数据分析 大数据

    文章目录 0 前言 1 课题背景 2 实现效果 3 数据获取 4 数据可视化 5 最后 0 前言

最新文章

  1. 准备好啦!!SaaS开发者社群正式对外招募
  2. java中的session对象,Java对象中Response与session对象的方法是什么?
  3. mysql union 出错_ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL)...
  4. azkaban 与 java任务_azkaban任务报错java.lang.RuntimeException: The root scratch dir: /tmp/hive...
  5. 权限管理系统如何分别实现对用户和角色的授权
  6. apache+mysql+wordpress的安装建站
  7. iOS 版微信可以改微信号;传腾讯计划入股爱奇艺;Qt 6.0 发布首个预览版本| 极客头条...
  8. 接口 vs 类型别名
  9. 1001 害死人不偿命的(3n+1)猜想 (15)
  10. Vue学习之旅Part3:Vue的全局过滤器和私有过滤器
  11. FME中GIS面分图层转为CAD填充并符号化,且图斑含面积属性
  12. 百度 UNIT 使用
  13. OpenCV+Mediapipe人物动作捕捉与Unity引擎的结合
  14. android开发 自定义锁屏界面,插件锁屏桌面自定义 “安卓4.0”界面美化教程
  15. HDU 2014 青年歌手大奖赛_评委会打分
  16. 360众测重装上阵,创新服务模式重塑众测新业态
  17. CodeVS 1697-⑨要写信
  18. shell--基础正则表达式之grep
  19. 【Math ML】Newton-Raphson.python 牛顿拉夫森方法
  20. 【Unity】关于 InputManager 以及改键功能的制作

热门文章

  1. 【数据结构】DFS 代码模板
  2. php 防止造假ip攻击,php防止网站被攻击的应急代码
  3. 做词云时报错cannot import name ‘WordCloud‘ from partially initialized module ‘wordcloud‘的解决办法
  4. markdown语法笔记(二)
  5. 走得快?走的远?---【锻炼身体 好好学习】
  6. linux 下 /dev和/sys/dev的区别
  7. git之windows下创建.gitignore文件
  8. C#之Xml去掉前面的空格
  9. 深度学习自学(三十九):基于对抗网络判别能力正则化的半监督生成方法
  10. CVPR学习(五):CVPR2019-人体姿态