草庐IT

Python中plt绘图包的基本使用方法

未来可期的 2023-04-25 原文

        在对数据进行处理和分析时,我们经常需要借助可视化工具,来将数据的一些特征以更易于我们理解的方式展现出来。在学习对Titanic - Machine Learning from Disaster | Kaggle的数据处理时,发现了自己对plt的了解和使用的缺失,因此进行一定的基础用法的学习,方便之后自己的使用,而不需要频繁的查阅资料。

        本文的代码参考自 Python深度学习入门之plt画图工具基础使用,并根据自己的理解做了一些改动。

        我将plt的图像绘制细分为四个步骤,分别是1)获取数据;2)设置画布;3)绘制内容;4)设置坐标轴刻度;5)添加网格;6)添加图例;7)添加坐标轴名称和图像标题;8)保存和展示。

1.数据的获取

         获取自己需要绘制的数据,一幅图需要x轴和y轴,所以需要两组数据。

import matplotlib.pyplot as plt
import random

x = range(60)
y1 = [random.uniform(35, 40) for i in x]    # uniform提供[35, 40)随机值
y2 = [random.uniform(25, 30) for j in x]

2.创建画布

# 创建画布
plt.figure(figsize=(8, 6), dpi=80) 

        我们使用plt.figure()函数创建空白画布。常用的参数中,figsize需要一个元组值,表示空白画布的横纵坐标比;dpi表示像素的个数,实际上就是对图像大小的控制。

3.绘制内容

        plt中提供了很多形式的内容绘制模块以供调用,例如曲线、散点图(scatter)、柱状图(bar)、饼图(pie)等。此处我们绘制双曲线图作为示例。

# 绘制曲线
plt.plot(x, y1, color='r', linestyle='--', label='Shanghai')
plt.plot(x, y2, color='g', linestyle='-.', label='Beijing')

        我们使用plt.plot()函数进行曲线的绘制。其中,前两个输入参数表示x轴和y轴的坐标,plot函数将提供的坐标点连接,即成为要绘制的各式线型。因此,平滑的曲线一般需要较密集的数据才能够绘制。常用的参数中,color表示绘制的颜色。官方提供的颜色种类如下表:

         linestyle参数表示绘制的线型,可用的线型包括 '-',  '--',  '-.',  ':',  'None',  ' ',  '',  'solid', 'dashed', 'dashdot', 'dotted',共11类。label参数则是对线段的一种名称标记,用于之后图例的绘制。

4.绘制图例

plt.legend(loc='best')  # 提供11种不同的图例显示位置

         plt.legend()函数用于绘制图例。loc参数表示图例的位置,默认为best,表示自动选择。

5.设置坐标轴刻度

# 设置刻度和步长
z = range(-10, 45)
x_label = ["10:{}".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
plt.yticks(z[::5])

        plt.xticks()和plt.yticks()函数用于设置坐标轴的步长和刻度。其中,第一个参数表示设置的步长大小;第二个参数表示显示的坐标轴刻度,默认为坐标的值。

6.添加网格信息

plt.grid(linestyle='--', alpha=0.5, linewidth=2)

        plt.grid()函数用于添加图片中的背景网格。常用参数中,alpha表示透明度设置,linewith表示线宽。

7.添加标题

# 添加标题
plt.xlabel('Time/ min')
plt.ylabel('Temperature/ ℃')
plt.title('Curve of Temperature Change with Time')

        plt.xlabel()、plt.ylabel()和plt.title()函数分别用于设置x坐标轴、y坐标轴和图标的标题信息。

8.保存和展示

# 保存和展示
# plt.savefig('./plt_img/test2.png')
plt.show()

        plt.savefig()函数用于保存图片,plt.show()函数则用于显示图片。

通过以上8个步骤,我们就能够使用plt包绘制出各式各样的基本图像了。

以下是几种常见图形的绘制和代码:

1.单折线

 代码:

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

# have a try

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

x = range(60)
# print(type(x))
y = [random.uniform(35, 40) for i in x]  # uniform提供[35, 40)随机值
# print(type(y))

# 创建画布
plt.figure(figsize=(12, 8), dpi=80)  # figsize为横纵坐标比,dpi为像素点个数

plt.plot(x, y)

# 设置刻度和步长
z = range(-10, 45)
x_label = ["10:{}".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
plt.yticks(z[::5])

# 添加网格信息
plt.grid(linestyle='--', alpha=0.5, linewidth=2)

# 添加标题
plt.xlabel('Time/ min')
plt.ylabel('Temperature/ ℃')
plt.title('Curve of Temperature Change with Time')

# 保存和展示
plt.savefig('./plt_img/test1.png')
plt.show()

 2.双折线

代码:

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

# 多曲线图
x = range(60)
# print(type(x))
y1 = [random.uniform(35, 40) for i in x]    # uniform提供[35, 40)随机值
y2 = [random.uniform(25, 30) for j in x]
# print(type(y))

# 创建画布
plt.figure(figsize=(8, 6), dpi=80)  # figsize为横纵坐标比,dpi为像素点个数

# 绘制曲线
plt.plot(x, y1, color='r', linestyle='--', label='Shanghai')
plt.plot(x, y2, color='g', linestyle='-.', label='Beijing')

# 绘制曲线图例
plt.legend(loc='best')  # 提供11种不同的图例显示位置

# 设置刻度和步长
z = range(-10, 45)
x_label = ["10:{}".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
plt.yticks(z[::5])

# 添加网格信息
plt.grid(linestyle='--', alpha=0.5, linewidth=2)

# 添加标题
plt.xlabel('Time/ min')
plt.ylabel('Temperature/ ℃')
plt.title('Curve of Temperature Change with Time')

# 保存和展示
# plt.savefig('./plt_img/test2.png')
plt.show()

3.多图像绘制

 代码:

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

# 多图
area = ['Shanghai\'s', 'Beijing\'s']
x = range(60)
# print(type(x))
y1 = [random.uniform(35, 40) for i in x]    # uniform提供[35, 40)随机值
y2 = [random.uniform(25, 30) for j in x]
# print(type(y))

# 创建画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 8), dpi=80)
axes[0].plot(x, y1, color='r', linestyle='--', label='Shanghai')
axes[1].plot(x, y2, color='g', linestyle='-.', label='Beijing')

# 分别对axes[0]和axes[1]进行之前操作
z = range(-10, 45)
x_label = ["10:{}".format(i) for i in x]
for t in range(2):
    # 设置步长
    axes[t].set_xticks(x[::10])
    axes[t].set_xticklabels(x_label[::10])
    axes[t].set_yticks(z[::5])

    # 添加图例
    axes[t].legend(loc='lower left')

    # 添加网格信息
    axes[t].grid(linestyle='--', alpha=0.5, linewidth=2)

    # 添加标题
    axes[t].set_xlabel('Time/ min')
    axes[t].set_ylabel('Temperature/ ℃')
    axes[t].set_title('Curve of {} Temperature Change with Time'.format(area[t]))

# 保存和展示
plt.savefig('./plt_img/test3.png')
plt.show()

4.曲线

 代码:

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

# 获取数据
x = np.linspace(-1, 1, 1000)    # 在[-1, 1]间生成1000个数
y = 2 * (x ** 2)

# 创建画布
plt.figure(figsize=(12, 8), dpi=80)  # figsize为横纵坐标比,dpi为像素点个数

# 绘制曲线
plt.plot(x, y)

# 绘制图例
# plt.legend()

# 添加网格信息
plt.grid(linestyle='--', alpha=0.5, linewidth=2)

# 添加标题
plt.xlabel('X')
plt.ylabel('Y')

# 保存和展示
plt.savefig('./plt_img/test4.png')
plt.show()

5.散点图

 代码:

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

# 散点图
x = np.linspace(-1, 1, 10)
y = 2 * (x ** 2)

# 创建画布
plt.figure(figsize=(12, 8), dpi=80)
plt.scatter(x, y)

# plt.legend()
# 添加网格信息
plt.grid(linestyle='--', alpha=0.5, linewidth=2)

# 添加标题
plt.xlabel('X')
plt.ylabel('Y')

# 保存和展示
plt.savefig('./plt_img/test5.png')
plt.show()

6.柱状图

 代码:

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

# 单柱状图
x = range(6)
# print(type(x))
y = [random.uniform(0, 100) for i in x]
# print(type(y))

# 创建画布
plt.figure(figsize=(8, 6), dpi=80)  # figsize为横纵坐标比,dpi为像素点个数

# 绘制内容
plt.bar(x, y, width=0.4, color=['r', 'k', 'y', 'g', 'b', 'c'], align='center')

# 绘制图例
# plt.legend()

# 显示具体值
for t in range(6):
    plt.text(x=t-0.08, y=y[t]+1, s=int(y[t]))   # x,y为显示坐标,s为内容

# 修改刻度
plt.xticks(x, ['class1', 'class2', 'class3', 'class4', 'class5', 'class6'])

# 添加网格信息
plt.grid(linestyle='--', alpha=0.5, linewidth=2)

# 添加标题
plt.xlabel('Classes')
plt.ylabel('Numbers')
plt.title('Bar')

# 保存和展示
plt.savefig('./plt_img/test6.png')
plt.show()

7.双柱状图

 代码:

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

# 双柱状图
x = range(6)
# print(type(x))
y = [random.uniform(0, 100) for i in x]
z = [random.uniform(0, 100) for j in x]
# print(type(y))

# 创建画布
plt.figure(figsize=(8, 6), dpi=80)  # figsize为横纵坐标比,dpi为像素点个数

# 绘制内容
plt.bar(x, y, width=0.2, color='b', label='value1')
# [i+0.2 for i in x]是对横坐标值的调整
plt.bar([i+0.2 for i in x], z, width=0.2, color='g', label='value2')

# 绘制图例
plt.legend()

# 显示具体值
for t in range(6):
    plt.text(x=t-0.08, y=y[t] + 1, s=int(y[t]))   # x,y为显示坐标,s为内容
    plt.text(x=t+0.12, y=z[t] + 1, s=int(z[t]))  # x,y为显示坐标,s为内容

# 修改刻度
plt.xticks(x, ['class1', 'class2', 'class3', 'class4', 'class5', 'class6'])

# 添加网格信息
plt.grid(linestyle='--', alpha=0.5, linewidth=2)

# 添加标题
plt.xlabel('Classes')
plt.ylabel('Numbers')
plt.title('Bar')

# 保存和展示
plt.savefig('./plt_img/test7.png')
plt.show()

 8.饼图

 代码:

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

# 饼图,一般小于9个类别

# 数据和标签
x = range(8)
y = [random.uniform(0, 200) for i in x]
label = ['class1', 'class2', 'class3', 'class4', 'class5', 'class6', 'class7', 'class8']

# 画布
plt.figure(figsize=(14, 8), dpi=80)

# 饼图
plt.pie(y, labels=label, colors=['r', 'gray', 'y', 'g', 'b', 'c', 'm', 'pink']
        , autopct='%1.1f%%')    # autopct表示显示数字百分比

# 图例
plt.legend(loc='upper right')

# 调整整体布局,防止图例和内容重叠
plt.axis('equal')

# 标题
plt.title('the Number of Classes')


# 展示
plt.savefig('./plt_img/test8.png')
plt.show()

感谢阅读!

有关Python中plt绘图包的基本使用方法的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  4. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  5. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  6. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  7. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  8. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  9. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  10. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

随机推荐