Python Matplotlib入门

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: Matplotlib_Study01 极坐标 雷达图代码:# 标签labels = np.array(['艺术A', '调研I', '实际R', '常规C', '企业E', '社会S'])# 数据个数dataLenth = 6# 数据data = np.array([1, 4, 3, 6, 4, 8])# 生成从0开始到6.28的6个并且不可能包括6.28 的一个数组# 这里又将原数组赋给...

Matplotlib_Study01


极坐标

雷达图

代码:

# 标签
labels = np.array(['艺术A', '调研I', '实际R', '常规C', '企业E', '社会S'])
# 数据个数
dataLenth = 6
# 数据
data = np.array([1, 4, 3, 6, 4, 8])

# 生成从0开始到6.28的6个并且不可能包括6.28 的一个数组
# 这里又将原数组赋给另一个变量跟之后的数组处理分开是因为在绘制标签时并不需要处理数组
angles1 = np.linspace(0, 2 * np.pi, dataLenth, endpoint=False)
print(angles1)
# 这里需要在数据中多添加一个数据跟第一个元素一致,实现闭合
data = np.concatenate((data, [data[0]]))  # 闭合
angles = np.concatenate((angles1, [angles1[0]]))  # 闭合

fig = plt.figure(figsize=(10, 10))
# 因为是雷达图 需要极坐标系,所以polar参数必须true
ax = fig.add_subplot(1, 1, 1, polar=True)  # polar参数!!
# 绘制线条,处理过的数组,o表示用圆点来表示节点
ax.plot(angles, data, '-o', linewidth=2)  # 画线
# 将框起来的数据使用颜色填充
ax.fill(angles, data, facecolor='b', alpha=0.25)  # 填充
# 设置标签,这里不需要处理的数组
ax.set_thetagrids(angles1 * 180 / np.pi, labels, fontproperties="SimHei")
# 设置title
ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei")

# 绘制第二条数据
ax.plot(angles, [1, 5, 1, 8, 0, 11, 1], '-o', linewidth=2)  # 画线
ax.fill(angles, [1, 5, 1, 8, 0, 11, 1], facecolor='r', alpha=0.25)  # 填充
# ax.set_thetagrids(angles1 * 180 / np.pi, labels, fontproperties="SimHei")

ax.set_rlim(0, 11)
# 
ax.grid(True)
plt.legend(
    ['group of 1 clusters, %d perple' % sum(data[1:]), 'group of 2 clusters, %d perple' % sum([1, 5, 1, 8, 1, 6])],
    loc='upper right', bbox_to_anchor=(1.1, 0.9))
plt.show()

效果:
不能正常显示中文
image.png

from matplotlib.font_manager import FontProperties

myfont = FontProperties(fname="C:\Windows\Fonts\simsun.ttc", size=20)
通过改变matplotlib 使用matplotlib的字体管理器指定字体文件。
但是,为字体添加的大小,加粗,斜体的样式都没有效果。

image.png

总结:
在显示中文时,可以使用font_manager 模块来设置字体文件,但添加不了样式。

更改后
代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.font_manager import FontProperties

# 设置字体文件
myfont = FontProperties(fname="C:\Windows\Fonts\simsun.ttc", style='italic', size=20, family='serif')
# matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文标签
# matplotlib.rcParams['axes.unicode_minus'] = False  # 这两行需要手动设置

# # 新建窗口
# fig = plt.figure(1)
# # 第一行第一列第一个,子图
# ax1 = fig.add_subplot(1, 1, 1, polar=True)
# theta=np.arange(0,2*np.pi,0.02)
# ax1.plot(theta,2*np.ones_like(theta),lw=2)
# ax1.plot(theta,theta/6,linestyle='--',lw=2)
# plt.show()

# =======自己设置开始============
# 标签
labels = np.array(['艺术A', '调研I', '实际R', '常规C', '企业E', '社会S'])
# 数据个数
dataLenth = 6
# 数据
data = np.array([1, 2, 3, 2, 2, 3])
# ========自己设置结束============

angles1 = np.linspace(0, 2 * np.pi, dataLenth, endpoint=False)
# print(angles1)
data = np.concatenate((data, [data[0]]))  # 闭合
angles = np.concatenate((angles1, [angles1[0]]))  # 闭合

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, polar=True)  # polar参数!!
ax.plot(angles, data, '-o', linewidth=2)  # 画线
ax.fill(angles, data, facecolor='b', alpha=0.25)  # 填充
ax.set_thetagrids(angles1 * 180 / np.pi, labels)
font = {
   
   
        # 'family': 'serif',
        'style': 'italic',
        'weight': 'bold',
        'color': 'red',
        'size': 25,
        # 'fontproperties': 'KaiTi'
        }
# 在使用时传入参数即可
ax.set_title("matplotlib嗷嗷嗷", loc='center', fontdict=font, fontproperties=myfont)

ax.plot(angles, [1, 2, 1, 3.5, 0, 3, 1], '-o', linewidth=2)  # 画线
ax.fill(angles, [1, 2, 1, 3.5, 0, 3, 1], facecolor='r', alpha=0.25)  # 填充
ax.set_thetagrids(angles1 * 180 / np.pi, labels, fontproperties='SimHei')
# 设置坐标轴刻度显示
ax.set_rlim(-2, 3.5, auto=False, emit=True)
ax.grid(True)
plt.legend(
    ['group of 1 clusters, %d perple' % sum(data[1:]), 'group of 2 clusters, %d perple' % sum([1, 5, 1, 8, 1, 6])],
    loc='upper right', bbox_to_anchor=(1.1, 0.9))
plt.show()

补充学习:

numpy

linspace
在指定的间隔内返回均匀间隔的数字
参数传递 (start, stop, num=50, endpoint=True, retstep=False, dtype=None)
从start开始,stop结束,会有num个数值返回。endpoint为True时一定包括stop,false时一定不包括。

concatenate
用于拼接 numpy数组。
参数传递 concatenate((array1, array2 .....), axis=0 或 1)
axis默认会导致返回一维结果,axis=0行数增加,axis=1列数增加

matplotlib

设置legend 的位置
plt.legend(
['group of 1 clusters, %d perple' % sum(data[1:]), 'group of 2 clusters, %d perple' % sum([1, 5, 1, 8, 1, 6])],
loc='upper right', bbox_to_anchor=(1.1, 0.9))
loc 参数
image.png

bbox_to_anchor被赋予的二元组中,num1用于控制legend的左右移动,值越大越向右边移动,num2用于控制legend的上下移动,值越大,越向上移动。用于微调图例的位置。


柱状图

代码:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

# 创建窗口,可以通过指定num为窗口指定ID
fig = plt.figure(figsize=(10, 10))
x_index = np.arange(1, 11, step=2)  # 柱的索引
x_data = ('A', 'B', 'C', 'D', 'E')
y1_data = (20, 35, 30, 35, 27)
y2_data = (25, 32, 34, 20, 25)
y3_data = (30, 21, 23, 15, 24)
bar_width = 0.35  # 定义一个数字代表每个独立柱的宽度

rects1 = plt.bar(x_index, y1_data, width=bar_width, alpha=0.4, color='b', label='legend1')  # 参数:左偏移、高度、柱宽、透明度、颜色、图例
rects2 = plt.bar(x_index + bar_width, y2_data, width=bar_width, alpha=0.5, color='r',
                 label='legend2')  # 参数:左偏移、高度、柱宽、透明度、颜色、图例
rects3 = plt.bar(x_index + 2*bar_width, y3_data, width=bar_width, alpha=0.5, color='g',
                 label='legend3')  # 参数:左偏移、高度、柱宽、透明度、颜色、图例
# 关于左偏移,不用关心每根柱的中心不中心,因为只要把刻度线设置在柱的中间就可以了
plt.xticks(x_index + 2*bar_width / 2, x_data)  # x轴刻度线
# 设置图像和边缘的距离,相比于tight_layout 更加精确
plt.subplots_adjust(left=0, bottom=0, right=1, top=1, hspace=0.1, wspace=0.1)
plt.legend()  # 显示图例
font = {
   
   
        # 'family': 'serif',
        'style': 'italic',
        'weight': 'bold',
        'color': 'red',
        'size': 25,
        # 'fontproperties': 'KaiTi'
        }
# 这里显示中文的问题跟昨天的一样,对于中文添加不上斜体的样式但可以添加颜色,字体大小。
plt.title("matplotlib柱状图", color='green', weight='bold', style='oblique', fontproperties='SimHei', fontsize=18)
plt.tight_layout()  # 自动控制图像外部边缘,此方法不能够很好的控制图像间的间隔
plt.show()

效果:

image.png

直方图

代码:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np

fig, (ax0, ax1) = plt.subplots(nrows=2, figsize=(12, 9))
sigma = 1  # 标准差
mean = 0  # 均值
x = mean + sigma * np.random.randn(10000)  # 正态分布随机数
# 绘制直方图
ax0.hist(x, bins=40, density=False, stacked=False, histtype='bar', facecolor='yellowgreen',
         alpha=0.75)  # normed是否归一化,histtype直方图类型,facecolor颜色,alpha透明度
ax1.hist(x, bins=20, density=False, stacked=False, histtype='bar', facecolor='pink', alpha=0.75, cumulative=True,
         rwidth=0.8)  # bins柱子的个数,cumulative是否计算累加分布,rwidth柱子宽度
# 可以同时设置主图的标题和子图标题,实现主标题和副标题的效果
# 设置总图中的标题
plt.suptitle("matplotlib_main_title", fontsize=18)
# 设置子图标题
ax0.set_title('matplotlib_slave1_title')
ax1.set_title('matplotlib_slave2_title')

plt.show()  # 所有窗口运行

效果:

image.png

散点图

代码:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

x = np.random.random(100)
print(x)
y = np.random.random(100)
print(y)
print(x*1000)
ax.scatter(x, y, s=x * 1000, c='y', marker=(5, 1), alpha=0.5, lw=1,
           facecolors='none')  # x横坐标,y纵坐标,s图像大小,c颜色,marker图片,lw图像边框宽度
# maker 支持'.'(点标记)、','(像素标记)、'o'(圆形标记)、'v'(向下三角形标记)、'^'(向上三角形标记)、'<'(向左三角形标记)、'>'(向右三角形标记)、'1'(向下三叉标记)、'2'(向上三叉标记)、'3'(向左三叉标记)、'4'(向右三叉标记)、's'(正方形标记)、'p'(五地形标记)、'*'(星形标记)、'h'(八边形标记)、'H'(另一种八边形标记)、'+'(加号标记)、'x'(x标记)、'D'(菱形标记)、'd'(尖菱形标记)、'|'(竖线标记)、'_'(横线标记)
# s 指示 散点的大小,c 指示颜色,lw指示散点边框宽度,alpha指示透明度
# edgecolors,指定散点边框的颜色。
plt.show()

效果:

image.png

补充:
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
可以通过以上代码,将grid 布局,非类目轴的图表的外框线去除。

折线图

代码:

import matplotlib.pyplot as plt
from matplotlib import pyplot
import matplotlib

# 设置窗口大小
fig = plt.figure(figsize=(20, 8))

ax = fig.add_subplot(1, 1, 1)

x = range(2, 26, 2)
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
# 设置坐标轴刻度显示,默认的过于粗糙
plt.xticks(x)  # 这里传入的x就是x轴的列表
plt.yticks(range(min(y), max(y) + 1))
# 设置坐标轴的标签显示
plt.xlabel('时间', fontproperties='SimHei')
plt.ylabel('温度', fontproperties='SimHei')
plt.title('时间温度表', fontproperties='SimHei', color='red', fontsize=18, style='italic')
# 是否显示网格(启用grid布局)
plt.grid()
# 绘制,设置图例表标签
pyplot.plot(x, y, label='legend1')
# 显示图例
plt.legend()
plt.show()

效果:

image.png

饼图

代码:

import matplotlib.pyplot as plt
import matplotlib

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)

labels = ['娱乐', '育儿', '饮食', '房贷', '交通', '其它']
sizes = [2, 5, 12, 70, 2, 9]
explode = (0, 0, 0, 0.1, 0, 0)
ax.pie(sizes, explode=explode, labels=labels, autopct='%1.0f%%', shadow=True, startangle=150)
plt.title("饼图示例-8月份家庭支出")
plt.show()

效果:

image.png

补充:
ax.pie() 参数详解
pie(x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
radius=None, counterclock=True, wedgeprops=None, textprops=None,
center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)

x:每一块饼图的比例,为必填项,如果sum(x)>1,会将多出的部分进行均分;
labels : 每一块饼图外侧显示的说明文字;
explode : 每一块饼图 离开中心距离,默认值为(0,0),就是不离开中心;
colors:数组,可选参数,默认为:None;用来标注每块饼图的matplotlib颜色参数序列。如果为None,将使用当前活动环的颜色。
shadow :是否阴影,默认值为False,即没有阴影,将其改为True,显示结果如下图所示;
autopct :控制饼图内百分比设置,可以使用format字符串或者format function;
startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定startangle=90则从y轴正方向画起;
counterclock:指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
labeldistance : label绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧,默认值为1.1;
radius :控制饼图半径;浮点类型,可选参数,默认为:None。如果半径是None,将被设置成1。
pctdistance : 类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。
将饼图显示为正圆形,plt.axis( );

词云

代码:

import matplotlib.pyplot as plt
import matplotlib
from wordcloud import WordCloud
import jieba
from imageio import imread

fig = plt.figure()

ax = fig.add_subplot(1, 1, 1)
# 读取文件内容
with open(r'C:\Users\Administrator\Desktop\wordcloud_test.txt', 'r') as f:
    text = f.read()
# 分词
wcsplit = jieba.lcut(text)
# 拼接成字符串
words = " ".join(wcsplit)
# 读取一张图片作为词云的背景
shape = imread(r'C:\Users\Administrator\Pictures\Saved Pictures\t.jpg')
# 创建wordcloud 对象
mywordcloud = WordCloud(
    font_path=r'C:\Windows\Fonts\simhei.ttf',  # 字体

    scale=8,

    margin=1,  # 页边距

    background_color='black',  # 背景色

    mask=shape,  # 形状

    max_words=1500,  # 包含的最大词量

    min_font_size=14,  # 最小的字体

    max_font_size=95,  # 最大字体

    random_state=4567
).generate(words)
# 显示图像
ax.imshow(mywordcloud)
# 去除坐标轴
ax.axis("off")
plt.show()

效果:

image.png

堆叠柱状图

代码:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np

# 添加柱状图的具体数值
def auto_labels(res):
    for rect in res:
        height = rect.get_height()
        plt.text(rect.get_x() + rect.get_width() / 2. - 0.2, 1.03 * height, '%s' % float(height))

# label
labels = ['G1', 'G2', 'G3', 'G4', 'G5', 'G6']  # 级别
men_means = np.random.randint(20, 35, size=6)
women_means = np.random.randint(20, 35, size=6)
men_std = np.random.randint(1, 7, size=6)
women_std = np.random.randint(1, 7, size=6)
width = 0.35
# 画图
a = plt.bar(labels,  # 横坐标
        men_means,  # 柱⾼
        width,  # 线宽
        # yerr=0,  # 误差条
        label='Men')  # 标签
# 堆叠柱状图,再画
b = plt.bar(labels, women_means, width, bottom=men_means, label='Women')
# 设置两坐标轴标签
plt.ylabel('Scores')
plt.xlabel('Species')
plt.title('Scores by group and gender')
# auto_labels(a)
# 填写数值
auto_labels(b)
plt.legend()

plt.show()

效果:

image.png

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
目录
相关文章
|
17天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
14天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
14天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
14天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
4天前
|
设计模式 缓存 开发者
Python中的装饰器:从入门到实践####
本文深入探讨了Python中强大的元编程工具——装饰器,它能够以简洁优雅的方式扩展函数或方法的功能。通过具体实例和逐步解析,文章不仅介绍了装饰器的基本原理、常见用法及高级应用,还揭示了其背后的设计理念与实现机制,旨在帮助读者从理论到实战全面掌握这一技术,提升代码的可读性、可维护性和复用性。 ####
|
14天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
25 3
|
17天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
16天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
16天前
|
移动开发 数据可视化 数据挖掘
利用Python实现数据可视化:以Matplotlib和Seaborn为例
【10月更文挑战第37天】本文旨在引导读者理解并掌握使用Python进行数据可视化的基本方法。通过深入浅出的介绍,我们将探索如何使用两个流行的库——Matplotlib和Seaborn,来创建引人入胜的图表。文章将通过具体示例展示如何从简单的图表开始,逐步过渡到更复杂的可视化技术,帮助初学者构建起强大的数据呈现能力。
|
16天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!