python -- 数据可视化

 一、Matplotlib 绘图


1、图形对象(图形窗口)

mp.figure(窗口名称, figsize=窗口大小, dpi=分辨率,
facecolor=颜色)
如果"窗口名称"是第一次出现,那么就创建一个新窗口,其标题栏显示该名称,如果"窗口名称"已经出现过,那么不再创建新窗口,而只是将与该名称相对应的窗口设置为当前窗口。所谓当前窗口,就是接受后续绘图操作的窗口。
mp.title(标题文本, fontsize=字体大小)
mp.xlabel(水平轴标签, fontsize=字体大小)
mp.ylabel(垂直轴标签, fontsize=字体大小)
mp.tick_params(..., labelsize=刻度标签字体大小, ...)
mp.grid(linestyle=网格线型)
mp.tight_layout() # 紧凑布局

demo:

from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi, np.pi, 1000) # -π — π,平分为1000等份
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
mp.figure('Figure Object 1', figsize=(4, 3), dpi=120,
facecolor='lightgray') # figsize:窗口比例 ;dpi:像素 ; facecolor:颜色
mp.title('Figure Object 1', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
mp.tight_layout()
mp.figure('Figure Object 2', figsize=(4, 3), dpi=120,
facecolor='lightgray')
mp.title('Figure Object 2', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
mp.tight_layout()
mp.figure('Figure Object 1') # 覆盖第一个窗口
mp.plot(x, cos_y, c='dodgerblue',
label=r'$y=\frac{1}{2}cos(x)$')
mp.legend()
mp.figure('Figure Object 2')
mp.plot(x, sin_y, c='orangered',
label=r'$y=sin(x)$') # label为备注
mp.legend()
mp.show()

界面:

     


2、条形图

mp.bar(水平坐标, 高度, 宽度[, 底坐标], color=颜色,
alpha=透明度, label=图例标签)

demo:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
apples = np.array([
30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15])
oranges = np.array([
24, 33, 19, 27, 35, 20, 15, 27, 20, 32, 20, 22])
mp.figure('Bar', facecolor='lightgray') # 绘图窗口
mp.title('Bar', fontsize=20)
mp.xlabel('Month', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10) # x、y label的字体大小
mp.grid(axis='y', linestyle=':') # 网格线,y方向,点线类型
mp.ylim((0, 40)) # y轴范围:0-40
x = np.arange(len(apples))
mp.bar(x, apples, 0.4, color='dodgerblue',
label='Apple') # 0.4:宽度 ;
mp.bar(x + 0.3, oranges, 0.4, color='orangered',
label='Orange', alpha=0.75) # x+0.3:水平坐标,在x基础上便宜0.3
mp.xticks(x + 0.1, [
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']) # x+0.1:x轴偏移0.1 ; mp.xticks(位置序列[, 标签序列])
mp.legend()
mp.show()

界面:

 


3、饼图

mp.pie(值, 间隙, 标签, 颜色, 格式,
shadow=是否带阴影, startangel=起始角度)

demo:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
values = [26, 17, 21, 29, 11]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01] # 偏移值,每个饼分图之间的距离
labels = ['Python', 'JavaScript',
'C++', 'Java', 'PHP']
colors = ['dodgerblue', 'orangered',
'limegreen', 'violet', 'gold']
mp.figure('Pie', facecolor='lightgray')
mp.title('Pie', fontsize=20)
mp.pie(values, spaces, labels, colors, '%d%%',
shadow=True, startangle=90) # shadow:阴影 ; startangle:角度
# 等轴比例
mp.axis('equal')
mp.show()

界面:

 


4、等高线图

mp.contourf(x, y, z, 阶数, cmap=颜色映射)
mp.contour(x, y, z, 阶数, linewidths=线宽)

demo:

from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
n = 1000
# 网格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
-x ** 2 - y ** 2)
mp.figure('Contour', facecolor='lightgray')
mp.title('Contour', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 绘制等高线图
mp.contourf(x, y, z, 8, cmap='jet')
cntr = mp.contour(x, y, z, 8, colors='black',
linewidths=0.5)
# 为等高线图添加高度标签
mp.clabel(cntr, inline_spacing=1, fmt='%.1f',
fontsize=10)
mp.show()

界面:

 


5、热成像图

# origin ↓↓↓:
# hight: 缺省,原点在左上角
# low:原点在左下角
mp.imshow(矩阵, cmap=颜色映射, origin=纵轴方向) #demo:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
n = 1000
# 网格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
-x ** 2 - y ** 2)
mp.figure('Hot', facecolor='lightgray')
mp.title('Hot', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 绘制热成像图
mp.imshow(z, cmap='jet', origin='low')
mp.colorbar().set_label('z', fontsize=14)
mp.show()

界面:

 


6、极坐标系

mp.gca(projection='polar')
水平坐标 -> 极角
垂直坐标 -> 极径
mp.plot(水平坐标, 垂直坐标, ...)
mp.plot(极角, 极径, ...)

demo:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
t = np.linspace(0, 2 * np.pi, 1001) # 1001个点,1000等分
r_spiral = 0.8 * t # 阿基米德螺旋线
r_rose = 5 * np.sin(6 * t) # 六元玫瑰线
mp.figure('Polar', facecolor='lightgray')
mp.gca(projection='polar') # 设置极坐标系
mp.title('Polar', fontsize=20)
mp.xlabel(r'$\theta$', fontsize=14)
mp.ylabel(r'$\rho$', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 函数值 = f (自变量)
# 垂直坐标 = f (水平坐标)
# 极径 = f (极角)
mp.plot(t, r_spiral, c='dodgerblue',
label=r'$\rho=0.8\theta$')
mp.plot(t, r_rose, c='orangered',
label=r'$\rho=5sin(6\theta)$')
mp.legend()
mp.show()

界面:

 


7、三维曲面

from mpl_toolkits.mplot3d import axes3d    #3d
ax = mp.gca(projection='3d') # class axes3d 指定
ax.set_xlabel(...)
...
ax.plot_surface(x, y, z, rstride=行跨距, cstride=列跨距,
cmap=颜色映射) # 用于绘制表面图
ax.plot_wireframe(x, y, z, rstride=行跨距, cstride=列跨距,
linewidth=线宽, color=颜色) # 用于绘制三维线框图

demo: 

 1)三维表面图

import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d
n = 1000
# 网格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
-x ** 2 - y ** 2)
mp.figure('3D Surface')
# 创建三维坐标系
ax = mp.gca(projection='3d') # 返回axes3d类的对象
mp.title('3D Surface', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 绘制三维表面图
ax.plot_surface(x, y, z, rstride=10, cstride=10,
cmap='jet')
mp.show()

界面:

 

2)三维线框图

from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d
n = 1000
# 网格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
-x ** 2 - y ** 2) mp.figure('3D Wireframe')
# 创建三维坐标系
ax = mp.gca(projection='3d') # 返回axes3d类的对象
mp.title('3D Wireframe', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 绘制三维线框图
ax.plot_wireframe(x, y, z, rstride=30, cstride=30,
linewidth=0.5, color='dodgerblue')
mp.show()

界面:

 


二、numpy进阶

1、读取文件

# 逻辑上可被解释为二维数组的文本文件:
# 数据项1<分隔符>数据项2<分隔符>...<分隔符>数据项n ...
numpy.loadtxt(
文件路径,
delimiter=分隔符(默认空格),
usecols=列序列(默认读取所有列),
unpack=是否展开列(默认为False),
dtype=元素类型(默认为float),
converters=转换器字典(默认不做转换))
# unpack=False: 一个二维数组
# unpack=True: 多个一维数组

demo1:

import numpy as np
# 读取aapl.csv中的某些列数据
dates, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt(
'../../data/aapl.csv', # 文件路径
delimiter=',',
usecols=(1, 3, 4, 5, 6), # 读取1,3,4,5,6 列的数据,从0计数
unpack=True, # 展开成多个一维数组
dtype='M8[D], f8, f8, f8, f8', # 每列读取出来的元素类型不一样
)

 demo2:画制 K线

 K线介绍:

 

# -*- coding: utf-8 -*-
import datetime as dt
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.dates as md def dmyToymd(dmy):
# 将"日-月-年"格式转为"年-月-日"格式
dmy = str(dmy, encoding='utf-8') # dmy:字节问题,通过str utf8编码,将其转换为字符串格式
date = dt.datetime.strptime(dmy, "%d-%m-%Y").date() # 将字符串格式的对象的dmy,转换成日期对象,且指定为date类型,不包括具体时间
ymd = date.strftime("%Y-%m-%d") # 将日期对象重新转换成字符串格式并返回
return ymd # 读取文件数据
# dates:日期 , opening_prices:开盘价, highest_prices:最高价 , lowest_prices:最低价 , closing_prices:收盘价
dates, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt(
"../data/aapl.csv",
delimiter = ",",
usecols = (1,3,4,5,6), # 读取1 ,3 ,4 ,5 ,6列的数据
unpack = True,
dtype = "M8[D], f8, f8, f8, f8", # 1列日期格式 Y-M-D,
converters = {1:dmyToymd} # 将读取到的第一列数据传入:dmyToymd函数中,执行过dmyToymd后再将值传回来,赋值给dates
) # 画图
mp.figure("Candlestick", facecolor="lightgray")
mp.title("Candlestick", fontsize=20)
mp.xlabel("Date", fontsize=14)
mp.ylabel("Price", fontsize=14)
ax = mp.gca() # 拿到当前坐标轴
ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO)) # 设置水平坐标以星期(WeekdayLocator)为周期,并且设置每个星期的星期一(byweekday=md.MO)为主刻度
ax.xaxis.set_minor_locator(md.DayLocator()) # 设置水平坐标每一天为次刻度
ax.xaxis.set_major_formatter(md.DateFormatter("%Y-%m-%d")) # 设置水平坐标主刻度标签格式。 md.DateFormatter("%d %b %Y"):国际通用格式 mp.tick_params(labelsize=10) # 设置刻度线label大小
mp.grid(linestyle=":") # 设置网格及其格式 dates = dates.astype(md.datetime.datetime) # 将dates转换成matplotlib能识别的日期格式 ,不然会报错
# 阳线掩码,收盘价高于开盘价
rise = closing_prices - opening_prices >= 0.01
# 阴线掩码,收盘价低于开盘价
fall = opening_prices - closing_prices >= 0.01
# 填充色
fc = np.zeros(dates.size, dtype='3f4')
fc[rise], fc[fall] = (1, 1, 1), (0, 0.5, 0) # 填充色→ 阳线:白色 ,阴线:绿色
# 边缘色
ec = np.zeros(dates.size, dtype='3f4')
ec[rise], ec[fall] = (1, 0, 0), (0, 0.5, 0) # 边缘颜色→ 阳线:红色 ,阴线:绿色
# 柱状图,先画上下影线,再画中间方块
mp.bar(dates, highest_prices - lowest_prices, 0,
lowest_prices, color=fc, edgecolor=ec)
mp.bar(dates, closing_prices - opening_prices, 0.8,
opening_prices, color=fc, edgecolor=ec)
# 自动调整水平坐标轴的日期标签
mp.gcf().autofmt_xdate()
mp.show()

获取到的 aapl.csv 数据:

 

 运行效果:

 



python -- 数据可视化(二)的更多相关文章

  1. Python数据可视化——使用Matplotlib创建散点图

    Python数据可视化——使用Matplotlib创建散点图 2017-12-27 作者:淡水化合物 Matplotlib简述: Matplotlib是一个用于创建出高质量图表的桌面绘图包(主要是2D ...

  2. Python数据可视化的四种简易方法

    摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视化是任何数据科学或机器学习项目的一个重要组成部分.人们常常会从探索数据分析(EDA)开始,来深入了解数据, ...

  3. python --数据可视化(一)

    python --数据可视化 一.python -- pyecharts库的使用 pyecharts--> 生成Echarts图标的类库 1.安装: pip install pyecharts ...

  4. python 数据可视化

    一.基本用法 import numpy as np import matplotlib.pyplot as plt x = np.linspace(-1,1,50) # 生成-1到1 ,平分50个点 ...

  5. 【python可视化系列】python数据可视化利器--pyecharts

    学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...

  6. Python数据可视化基础讲解

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:爱数据学习社 首先,要知道我们用哪些库来画图? matplotlib ...

  7. python数据可视化-matplotlib入门(7)-从网络加载数据及数据可视化的小总结

    除了从文件加载数据,另一个数据源是互联网,互联网每天产生各种不同的数据,可以用各种各样的方式从互联网加载数据. 一.了解 Web API Web 应用编程接口(API)自动请求网站的特定信息,再对这些 ...

  8. Python数据可视化编程实战——导入数据

    1.从csv文件导入数据 原理:with语句打开文件并绑定到对象f.不必担心在操作完资源后去关闭数据文件,with的上下文管理器会帮助处理.然后,csv.reader()方法返回reader对象,通过 ...

  9. Python数据可视化-seaborn库之countplot

    在Python数据可视化中,seaborn较好的提供了图形的一些可视化功效. seaborn官方文档见链接:http://seaborn.pydata.org/api.html countplot是s ...

随机推荐

  1. EMA指数平滑移动平均

    英文参考:http://www.incrediblecharts.com/indicators/exponential_moving_average.php Exponential moving av ...

  2. HCL试验9

    PC1配置: ip:192.168.1.1 掩码:255.255.255.0 网关:192.168.1.254 上路由器配置: sys int gi0/0 ip add 192.168.100.10 ...

  3. 解析之IIS解析

  4. eclipse -------导出war包

    1.右键工程名--Export----- WAR file 2.输入war包名,选择导出路径,finish完成

  5. 让mysql的id字段变成表的主键

    1.#已经加主键 desc szdj.sys_message_user;alter table sys_message_user add constraint pk_mess_user primary ...

  6. nginx 反向代理是url带后缀

    1.后端:http://10.253.149.2/tdsqlpcloud/index.php 2.配置文件 danjan01deiMac:nginx danjan01$ cat /usr/local/ ...

  7. [python] 进度条效果

    method 1 如果出现多行显示,添加选项 tqdm(iter,ncols=40) """ ncols : int, optional The width of the ...

  8. 2019牛客暑期多校训练营(第二场)-E MAZE

    题目链接:https://ac.nowcoder.com/acm/contest/882/E 题意:n×m的矩阵,0表示可以走,1表示墙,不能通过.有q中操作,一种是改变坐标(x,y)的状态,一种是询 ...

  9. 300英雄的危机(heroes)

    题面 正解与图书馆馆长的考验一致,都是分层图SPFA: #include <iostream> #include <cstdio> #include <cstring&g ...

  10. C++学习 之 继承方式(笔记)

    1.继承方式的分类 继承方式有公有继承,私有继承,保护继承.不同之处在于指定派生类的基类时使用的关键字不同:公有继承使用关键字public,私有继承使用关键字private,保护继承使用关键字prot ...