Matplotlib-高级篇


*导入常用库的一个方法

  1. 在当前工程目录下新建一个base.py文件,输入常用需要导入的语句等

    
    #base.py文件内
    
    import numpy as np
    import matplotlib.pyplot as plt
    from numpy import pi
    import csv
    
    
    
    #用来正常显示中文标签 
    
    plt.rcParams['font.sans-serif']=['SimHei'] 
    
    #用来正常显示负号
    
    plt.rcParams['axes.unicode_minus']=False
  2. 当前工程下直接输入下述语句即可导入base.py中的内容

    %run base.py

一、高级篇之再论柱状图

# 创建一个画板
fig = plt.figure(1)

#在画板上划分出1行1列共1个绘图区域(坐标系统)
ax1 = plt.subplot(111)  #选中第一行第一列的第一绘图区域

#准备数据
data = np.array([15,20,18,25])

#定义柱状图柱子的宽度
width = 0.5
# 给定x坐标的数据刻度
x_bar = np.arange(4)


#通过ax1对象在ax1坐标系统中绘制柱状图
rect = ax1.bar(x = x_bar,height = data,width=width,color="lightblue")

#修改x轴坐标的刻度
ax1.set_xticks(x_bar)
ax1.set_xticklabels(["第一季度","第二季度","第三季度","第四季度"])

#显示网格
ax1.grid(True)

#设置y轴坐标的标注
ax1.set_ylabel("销量(单位:万件)")
# 设置标题
ax1.set_title("2017年季度销量统计")

# 对y轴进行缩放
ax1.set_ylim(0,28)

# 在ax1坐标系统的(2,25)的位置添加一些文字
# ax1.text(2,25,"aaa")

# 遍历柱状图中四根柱子的信息
for rec in rect:
    #print(res)
    x = rec.get_x()#获取每根柱子的左边起始位置
    height = rec.get_height()#获取每根柱子的高度
    print("柱子的x轴坐标:{},y轴坐标{}".format(x,height))
    # 在相应的坐标点添加文字
    ax1.text(x+0.2,height*1.02,str(height)+"w")#调整使得数据显示在每根柱子的中心往上一点的位置

plt.show()
柱子的x轴坐标:-0.25,y轴坐标15
柱子的x轴坐标:0.75,y轴坐标20
柱子的x轴坐标:1.75,y轴坐标18
柱子的x轴坐标:2.75,y轴坐标25

这里写图片描述

二、Matplotlib加载数据并进行可视化展示—with open:

x = []
y = []
with open("matplotlib-demo.csv","r") as file:
    datas = csv.reader(file,delimiter=",")
    for row in datas:
        x.append(int(row[0]))
        y.append(int(row[1]))
print(x)
print(y)

plt.plot(x,y,label="折线图")
plt.title("matplotlib加载文件数据")
plt.show()
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[5, 3, 4, 7, 4, 3, 5, 7, 4, 4]

这里写图片描述

三、Matplotlib加载数据并进行可视化展示-简化版(numpy.loadtxt())

# 用numpy.loadtxt()加载csv文件
x,y = np.loadtxt("matplotlib-demo.csv",delimiter=",",usecols=(0,1),unpack=True)
print(x.dtype)
print(y.dtype)
float64
float64
plt.plot(x,y,label="折线图")
plt.title("numpy加载文件数据并用matplotlib可视化")
plt.legend()
plt.show()

这里写图片描述

四、加载网络数据并用码头plotlib进行可视化展示

# 利用requests模块加载网络接口中的json字符串
import requests
# 导入json模块
import json
dataStr = requests.get("https://api.douban.com/v2/book/1220562").text
print("原始数据类型:",type(dataStr))
dataDict = json.loads(dataStr)
print("转化后数据类型:",type(dataDict))
print(dataDict)
原始数据类型: <class 'str'>
转化后数据类型: <class 'dict'>
{'rating': {'max': 10, 'numRaters': 375, 'average': '7.3', 'min': 0}, 'subtitle': '', 'author': ['[日] 片山恭一'], 'pubdate': '2005-1', 'tags': [{'count': 144, 'name': '片山恭一', 'title': '片山恭一'}, {'count': 71, 'name': '日本', 'title': '日本'}, {'count': 65, 'name': '日本文学', 'title': '日本文学'}, {'count': 41, 'name': '小说', 'title': '小说'}, {'count': 34, 'name': '满月之夜白鲸现', 'title': '满月之夜白鲸现'}, {'count': 17, 'name': '爱情', 'title': '爱情'}, {'count': 10, 'name': '純愛', 'title': '純愛'}, {'count': 9, 'name': '外国文学', 'title': '外国文学'}], 'origin_title': '', 'image': 'https://img3.doubanio.com/view/subject/m/public/s1747553.jpg', 'binding': '平装', 'translator': ['豫人'], 'catalog': '\n      ', 'pages': '180', 'images': {'small': 'https://img3.doubanio.com/view/subject/s/public/s1747553.jpg', 'large': 'https://img3.doubanio.com/view/subject/l/public/s1747553.jpg', 'medium': 'https://img3.doubanio.com/view/subject/m/public/s1747553.jpg'}, 'alt': 'https://book.douban.com/subject/1220562/', 'id': '1220562', 'publisher': '青岛出版社', 'isbn10': '7543632608', 'isbn13': '9787543632608', 'title': '满月之夜白鲸现', 'url': 'https://api.douban.com/v2/book/1220562', 'alt_title': '', 'author_intro': '', 'summary': '那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人,父亲则认为当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。', 'price': '15.00元'}
tags = dataDict["tags"]
# tags
# 取出tags中所有的count和name字段
x = []  # 保存name
y = []  # 保存count
for tag in tags:
    x.append(tag["name"])
    y.append(tag["count"])
print(x)
print(y)
['片山恭一', '日本', '日本文学', '小说', '满月之夜白鲸现', '爱情', '純愛', '外国文学']
[144, 71, 65, 41, 34, 17, 10, 9]
# 利用x和y轴数据绘制柱状图
plt.bar(x,y,label="图书搜索热词")
plt.xlabel("x轴-图书搜索热词")
plt.ylabel("y轴-搜索热词的排名")
plt.title("图书搜索热词排名")
plt.legend()
plt.show()

这里写图片描述

五,同一个画板中绘制多幅图表

plt.figure(figsize=(6,6),dpi=80)
plt.figure(1) # 创建第一个画板(figure)
plt.subplot(211) # 划分画板为2 行 1 列,共 2 块区域,并获取当前画板的第一个子图(子块)
plt.plot([1, 2, 3],[4,9,1]) # 绘图
plt.subplot(212) # 获取当前画板的第二个子图(子块)
plt.plot([4, 5, 6],[10,4,7]) # 绘图

#创建第二个画板
plt.figure(2)
#如果不给区域
plt.plot([4, 5, 6],[3,2,5])
plt.title('第二个画板的第一个图')
#希望在此处为第一个画板的图添加标题等信息
plt.figure(1)#从画板二切换到画板一
plt.subplot(212)
plt.title('一画板的第二个图')
# 调整每隔子图之间的距离
plt.tight_layout()
plt.subplot(211)
plt.title('一画板的第一个图')
plt.show()

这里写图片描述
这里写图片描述

  • 注意此时会有一个警告
E:\ProgramData\Anaconda3\lib\site-packages\matplotlib\cbook\deprecation.py:107: 
MatplotlibDeprecationWarning: Adding an axes using the same arguments as a 
previous axes currently reuses the earlier instance.  In a future version, a new 
instance will always be created and returned.  Meanwhile, this warning can be 
suppressed, and the future behavior ensured, by passing a unique label to each 
axes instance.
  warnings.warn(message, mplDeprecation, stacklevel=1)

这是因为上面用的plt.figure()转换方法不推荐,下面以ax做坐标系统对象添加标题则不会出现问题

plt.figure(figsize=(6,6),dpi=80)

plt.figure(1) # 创建第一个画板(figure)

ax1 = plt.subplot(211) 

a=ax1.plot([1, 2, 3],[4,9,1]) 

ax2 = plt.subplot(212) 
b=ax2.plot([4, 5, 6],[10,4,7]) 

plt.tight_layout(3)#指定间隔的距离

plt.figure(2)
plt.plot([4, 5, 6],[3,2,5])
plt.title('第二个画板的第一个图')

ax1.set_title('一画板的第一个图')
ax2.set_title('一画板的第二个图')

plt.show()

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_27171347/article/details/81292888