Python数据可视化-第4章-图表样式的美化

news2025/4/7 23:01:36

环境

开发工具

VSCode

库的版本

numpy==1.26.4
matplotlib==3.10.1
ipympl==0.9.7

教材

本书为《Python数据可视化》一书的配套内容,本章为第4章 图表样式的美化
本章主要介绍了图表样式的美化,包括图表样式概述、使用颜色、选择线型、添加数据标记、设置字体、切换主题风格和填充区域。通过学习本章的内容,希望读者可以明确图表美化的意义,并能够采用适当的方式进行图表美化。
在这里插入图片描述

参考

政务可视化设计经验-图表习惯

数据可视化设计必修课(一):图表篇

一文讲透 | 大屏数据可视化图表选用指南

第4章-图表样式的美化

4.1 图表样式概述

4.1.1 默认图表样式

matplotlib在绘图的过程中会读取存储在本地的配置文件matplotlibrc,通过matplotlibrc文件中的缺省配置信息指定图表元素的默认样式,完成图表元素样式的初始设置。
通过rc_params()函数可以查看matplotlibrc文件中全部的配置项。
rc_params()函数返回一个RcParams对象。RcParams对象是一个字典对象,其中字典的键为由配置要素(如axes)及其属性(如edgecolor)组成的配置项,值为配置项的默认值(如black)。
在这里插入图片描述

import matplotlib
matplotlib.rc_params()

输出如下

RcParams({‘_internal.classic_mode’: False,
‘agg.path.chunksize’: 0,
‘animation.bitrate’: -1,
‘animation.codec’: ‘h264’,
‘animation.convert_args’: [‘-layers’, ‘OptimizePlus’],
‘animation.convert_path’: ‘convert’,
‘animation.embed_limit’: 20.0,
‘animation.ffmpeg_args’: [],
‘animation.ffmpeg_path’: ‘ffmpeg’,
‘animation.frame_format’: ‘png’,
‘animation.html’: ‘none’,
‘animation.writer’: ‘ffmpeg’,
‘axes.autolimit_mode’: ‘data’,
‘axes.axisbelow’: ‘line’,
‘axes.edgecolor’: ‘black’,
‘axes.facecolor’: ‘white’,
‘axes.formatter.limits’: [-5, 6],
‘axes.formatter.min_exponent’: 0,
‘axes.formatter.offset_threshold’: 4,
‘axes.formatter.use_locale’: False,
‘axes.formatter.use_mathtext’: False,
‘axes.formatter.useoffset’: True,
‘axes.grid’: False,
‘axes.grid.axis’: ‘both’,
‘axes.grid.which’: ‘major’,

‘ytick.minor.right’: True,
‘ytick.minor.size’: 2.0,
‘ytick.minor.visible’: False,
‘ytick.minor.width’: 0.6,
‘ytick.right’: False})

配置项按照作用对象的不同主要分为10种
配置要素:
在这里插入图片描述

常用配置项
在这里插入图片描述
在这里插入图片描述
matplotlib库载入时会主动调用rc_params()函数获取包含全部配置项的字典,并将该字典赋值给变量rcParams,以便用户采用访问字典rcParams的方式设置或获取配置项

4.1.2 图表样式修改

matplotlib通过灵活地修改配置项以改变图表的样式,而不必拘泥于系统默认的配置。图表的样式可以通过两种方式进行修改:局部修改全局修改

局部修改

局部修改的方式是指通过代码动态地修改matplotlib配置项,此方式用于程序局部定制的需求。若希望局部修改图表的样式,可以通过以下任一种方式实现。
第1种—通过给绘图函数或设置图表元素函数的关键字参数传值来修改图表的样式。
第2种—通过“rcParams[配置项]”重新为配置项赋值来修改图表的样式。
第3种—通过给rc()函数的关键字参数传值来修改图表的样式。
第1种方式只能对某一指定元素的样式进行修改,
第2种和第3种方式可以对整个py文件中全部指定元素的样式进行修改。

rc(group, **kwargs)

group:表示配置要素。
**kwargs:表示配置要素的属性。

设置线条的宽度
在这里插入图片描述

全局修改

全局修改的方式是指直接修改matplotlibrc文件的配置项,此方式适用于程序全局定制的需求,可以将指定的图表样式进行统一修改,无需每次在具体的程序中进行单独修改。 matplotlib使用matplotlibrc文件的路径搜索顺序:
当前工作路径:程序运行的目录。
用户配置路径:通常位于HOME/.matplotlib/目录中,可以通过环境变量MATPLOTLIBRC进行修改。
系统配置路径:位于matplotlib安装路径的mpl-data目录中。
matplotlib可以使用matplotlib_fname()函数查看当前使用的matplotlibrc文件所在的路径。

import matplotlib
matplotlib.matplotlib_fname()

‘d:\ProgramData\Anaconda3\envs\py312\Lib\site-packages\matplotlib\mpl-data\matplotlibrc’

4.2 使用颜色

4.2.1 使用基础颜色

图表在使用颜色时应遵循一定的基本规则,既要避免使用过多的颜色,又要避免随意使用颜色,否则会直接影响可视化的效果且不易让人理解。
在这里插入图片描述

matplotlib的基础颜色主要有3种表示方式:单词缩写或单词十六进制或HTML模式RGB模式

单词缩写或单词表示的颜色

matplotlib中支持使用单词缩写或单词表示的8种颜色:青色、洋红色、黄色、黑色、红色、绿色、蓝色、白色。
在这里插入图片描述

十六进制/HTML模式表示的颜色

matplotlib支持使用十六进制或HTML模式表示更多的颜色,它将这些颜色存储在colors.cnames字典中,可通过访问colors.cnames字典查看全部的颜色。

import matplotlib
import matplotlib.colors
print(len(matplotlib.colors.cnames.items()))
for name, hex in matplotlib.colors.cnames.items():
    print(name, hex)

148
aliceblue #F0F8FF
antiquewhite #FAEBD7
aqua #00FFFF
aquamarine #7FFFD4
azure #F0FFFF
beige #F5F5DC
bisque #FFE4C4
black #000000
blanchedalmond #FFEBCD
blue #0000FF
blueviolet #8A2BE2
brown #A52A2A
burlywood #DEB887
cadetblue #5F9EA0
chartreuse #7FFF00
chocolate #D2691E
coral #FF7F50
cornflowerblue #6495ED
cornsilk #FFF8DC
crimson #DC143C
cyan #00FFFF
darkblue #00008B
darkcyan #008B8B

white #FFFFFF
whitesmoke #F5F5F5
yellow #FFFF00
yellowgreen #9ACD32

RGB模式表示的颜色

matplotlib支持使用RGB模式的三元组表示颜色,其中元组的第1个元素代表红色值,第2个元素代表绿色值,第3个元素代表蓝色值,且每个元素的取值范围均是[0,1]。

以上3种方式表示的颜色都可以传入matplotlib中带有表示颜色的color或c参数的函数或方法中,从而为图表的相应元素设置颜色。

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [3, 4, 5], color='g') # 第1种
plt.plot([1, 2, 3], [4, 5, 6], color='#2E8B57')  # 第2种
plt.plot([1, 2, 3], [5, 6, 7], color=(0.0, 0.5, 0.0)) # 第3种

在这里插入图片描述

4.2.2 使用颜色映射表

matplotlib中内置了众多预定义的颜色映射表,使用这些颜色表可以为用户提供更多的颜色建议,节省大量的开发时间。
通过colormaps()函数可以查看所有可用的颜色映射表。

import matplotlib.pyplot as plt
print(len(plt.colormaps()))
plt.colormaps()

180
[‘magma’,
‘inferno’,
‘plasma’,
‘viridis’,
‘cividis’,
‘twilight’,
‘twilight_shifted’,
‘turbo’,
‘berlin’,
‘managua’,
‘vanimo’,
‘Blues’,
‘BrBG’,
‘BuGn’,
‘BuPu’,
‘CMRmap’,
‘GnBu’,
‘Greens’,
‘Greys’,
‘OrRd’,
‘Oranges’,
‘PRGn’,
‘PiYG’,
‘PuBu’,
‘PuBuGn’,

‘tab20c_r’,
‘grey_r’,
‘gist_grey_r’,
‘gist_yerg_r’,
‘Grays_r’]
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings…

颜色映射表一般可以划分为以下3类:

Sequential:表示同一颜色从低饱和度到高饱和度的单色颜色映射表。
Diverging:表示颜色从中间的明亮色过渡到两个不同颜色范围方向的颜色映射表。
Qualitative:表示可以轻易区分不同种类数据的颜色映射表。

开发人员可以自定义新的颜色映射表,再通过matplotlib.cm.register_cmap()函数将自定义的颜色映射表添加到matplotlib中。

matplotlib主要有两种使用颜色映射表的方式,

第一种方式是在调用函数或方法绘制图表或添加辅助元素时将颜色映射表传递给关键字参数cmap
第二种方式是直接调用set_cmap()函数进行设置。
在这里插入图片描述

import matplotlib
import matplotlib.cm
import matplotlib.pyplot as plt
import numpy as np
x=[1,2,3,4,5,6,7,8,9,10]
y=[2,2,3,3,4,4,5,5,6,6]
np.random.seed(3)
# plt.scatter(x,y,c=np.random.rand(10),cmap=matplotlib.cm.jet)
plt.scatter(x,y,c=np.random.rand(10))
plt.set_cmap(matplotlib.cm.jet)

输出如下:
在这里插入图片描述

4.2.3 实例1:两个地区对不同种类图书的采购情况

高尔基说:“书籍是人类进步的阶梯”。据统计韩国人的年均阅读量为7本,日本人的年均阅读量为40本,相比较而言,中国人的年均阅读量为0.7本,还有很大的进步空间。

本实例要求根据下表的数据,绘制反映地区1和地区2对各类图书采购情况的堆积柱形图,并使用#FFCC00#B0C4DE这两种颜色区分地区1和地区2对应的两组柱形。
在这里插入图片描述
在这里插入图片描述

# 01_book_purchase
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x = np.arange(5)
y1 = [1200, 2400, 1800, 2200, 1600]
y2 = [1050, 2100, 1300, 1600, 1340]
bar_width = 0.6
tick_label = ["家庭", "小说", "心理", "科技", "儿童"]
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制柱形图 , 并使用颜色
ax.bar(x, y1, bar_width, color="#FFCC00", align="center", label ="地区1")
ax.bar(x, y2, bar_width, bottom=y1, color="#B0C4DE", align="center", label="地区2")
ax.set_ylabel("采购数量(本)")
ax.set_xlabel("图书种类")
ax.set_title(" 地区1和地区2对各类图书的采购情况")
ax.grid(True, axis='y', color="gray", alpha=0.2)
ax.set_xticks(x)
ax.set_xticklabels(tick_label)
ax.legend()
plt.show()

在这里插入图片描述

4.3 选择线型

4.3.1 选择线条的类型

图表中每个线条均具有不同的含义,一般可以通过颜色、宽度、类型来区分线条,其中类型是区分线条的常见方式之一。
matplotlib中内置了4种线条的类型:短虚线点划线长虚线实线
在这里插入图片描述

在使用pyplot绘制折线图、显示网格或添加参考线时,可以将线型取值传递给linestyle或ls参数,以选择其它的线条类型。

import matplotlib.pyplot as plt
import matplotlib

plt.plot([1, 2, 3], [3, 4, 5], linestyle='--')
plt.plot([1, 2, 3], [4, 5, 6], ls='--')

输出如下:
在这里插入图片描述

4.3.2 实例2:2017年7月与2019年7月国际外汇市场美元/人民币汇率走势

汇率又称外汇利率,指两种货币之间兑换的比率,亦可视为一个国家的货币对另一种货币的价值。汇率会因诸多外界因素(如国际收支状况、通货膨胀)的影响而出现上下波动,从而产生货币贬值和货币升值的现象。

本实例要求根据下表的数据,绘制反映2017年7月与2019年7月美元/人民币汇率走势的折线图,并使用实线长虚线区分代表2017年和2019年汇率走势的两条折线。
在这里插入图片描述
在这里插入图片描述

# 02_dollar_RMB_exchange_rate
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 汇率
eurcny_2017 = np.array([6.8007, 6.8007, 6.8015, 6.8015, 6.8060,  6.8060, 6.8060, 6.8036, 
                        6.8025, 6.7877, 6.7835, 6.7758, 6.7700, 6.7463, 6.7519,6.7511, 
                        6.7511, 6.7539, 6.7265])
eurcny_2019 = np.array([6.8640, 6.8705, 6.8697, 6.8697, 6.8697,6.8881, 6.8853, 6.8856, 
                        6.8677, 6.8662, 6.8662, 6.8662, 6.8827, 6.8761, 6.8635,6.8860, 
                        6.8737, 6.8796, 6.8841])
date_x = np.array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 19, 24, 25, 26, 31])
fig = plt.figure()
ax = fig.add_subplot(111)
# 第1 条折线 : 湖绿色 , 实线 , 线宽为 2
ax.plot(date_x, eurcny_2017, color='#006374', linewidth=2, label='2017年7月美元/人民币汇率')
# 第2 条折线 : 紫色 , 长虚线 , 线宽为 2
ax.plot(date_x, eurcny_2019, color='#8a2e76', linestyle='--', linewidth=2, label='2019年7月美元/人民币汇率')
ax.set_title('2017年7月与2019年7月美元/人民币汇率走势')
ax.set_xlabel('日期')
ax.set_ylabel('汇率')
ax.legend()
plt.show()

输出为:
在这里插入图片描述

4.4 添加数据标记

4.4.1 添加折线图或散点图的数据标记

数据标记一般指代表单个数据的圆点或其它符号等,用于强数据点的位置,常见于折线图和散点图中。

matplotlib中内置了许多数据标记,使用这些数据标记可以便捷地为折线图或散点图标注数据点。数据标记可以分为填充型数据标记非填充型数据标记
在这里插入图片描述

在使用pyplot的plot()scatter()函数绘制折线图或散点图时,可以将标记取值传递给marker参数,从而为折线图或散点图添加数据标记。
在这里插入图片描述

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [3, 4, 5], marker='*')

还可以给plot()或scatter()函数的以下参数传值来设置数据标记的属性

markeredgecolor或mec:表示数据标记的边框颜色。
markeredgewidth或mew:表示数据标记的边框宽度。
markerfacecolor或mfc:表示数据标记的填充颜色。
markerfacecoloralt或mfcalt:表示数据标记备用的填充颜色。
markersize或ms:表示数据标记的大小。
在这里插入图片描述

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [3, 4, 5], marker='*', markersize=20, markerfacecolor='y')

在使用matplotlib绘制折线图时,可以使用字符串分别为线条指定颜色、线型和数据标记这三种样式,但每次都需要分别给参数color、linestyle(ls)、marker传值进行一一设置,使得编写的代码过于繁琐。为此,matplotlib提供了由颜色、标记、线型构成的格式字符串。

多学一招: matplotlib格式字符串

在使用matplotlib绘制折线图时,可以使用字符串分别为线条指定颜色、线型和数据标记这三种样式,但每次都需要分别给参数color、linestyle(ls)、marker传值进行一一设置,使得编写的代码过于繁琐。为此,matplotlib提供了由颜色标记线型构成的格式字符串。
格式字符串是快速设置线条基本样式的缩写形式的字符串。
'[颜色][标记][线型]'
以上格式的每个选项都是可选的,选项之间组合的顺序也是可变的。
若格式字符串中只有颜色一个选项,可以使用十六进制、单词拼写等其它形式表示的颜色。
颜色只能是通过单词缩写方式表示的颜色。

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [3, 4, 5], 'mo--')

在这里插入图片描述

4.4.2 实例3:标记不同产品各季度的销售额

本实例要求根据下表的数据,将季度列的数据作为x轴的刻度标签,将产品A、产品B、产品C这三列的数据作为y轴的数据,使用plot()函数绘制反映产品A、产品B和产品C各季度销售额的折线图,并使用不同的线型、颜色、标记区分3个线条
在这里插入图片描述
在这里插入图片描述

# 03_sales_of_different_products
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
sale_a = [2144, 4617, 7674, 6666]
sale_b = [853, 1214, 2414, 4409]
sale_c = [153, 155, 292, 680]
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制具有不同线条样式的折线图
ax.plot(sale_a, 'D-', sale_b, '^:', sale_c, 's--')
ax.grid(alpha=0.3)
ax.set_ylabel('销售额(万元)')
ax.set_xticks(np.arange(len(sale_c)))
ax.set_xticklabels(['第1季度','第2季度', '第3季度', '第4季度'])
ax.legend(['产品A','产品B','产品C'])
plt.show()

输出为:
在这里插入图片描述

4.5 设置字体

4.5.1 设置字体样式

不同的字体给人的直观感受不同,比如宋体给人雅观、大气的感觉;黑体给人厚重、抢眼的感觉。由于每种字体的特点是不一样的,所以每种字体能够适用的场合也是不一样的。
合适的字体可以对图表起到很好的修饰作用
在这里插入图片描述

matplotlib中文本是text模块的Text类对象,可以通过之前介绍的text()、annotate()、title()等函数进行创建。Text类中提供了一系列设置文本字体样式的属性,包括字体类别、字体大小、字体风格等。
在这里插入图片描述
表中的属性也可以作为text()、annotate()、title()函数的同名关键字参数,以便用户在创建文本的同时设置字体的样式。

在这里插入图片描述

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [3, 4, 5])
# 参数说明
# x: 横坐标 y: 纵坐标
# color: 线条颜色
# linestyle: 线条样式
# linewidth: 线条宽度
# marker: 标记点样式
# markersize: 标记点大小
# markerfacecolor: 标记点颜色
# markeredgecolor: 标记点边缘颜色

plt.text(1.9, 3.75, 'y=x+2', bbox=dict(facecolor='y'), family='serif', fontsize=18, fontstyle='normal', rotation=-60)

在这里插入图片描述

4.5.2 实例4:未来15天最高气温和最低气温(设置字体样式)

2.1.2节实例1的折线图既没有使用数据标记标注数据的位置,也没有使用注释文本标注具体的数值,影响用户的阅读体验。
在这里插入图片描述
本实例要求对前面的折线图进行调整,为该图中的折线添加数据标记和注释文本,并设置注释文本的字体样式
在这里插入图片描述

# 04_maximum_minimum_temperatures
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(4, 19)
y_max =[32, 33, 34, 34, 33, 31, 30, 29, 30, 29, 26, 23, 21, 25,  31]
y_min = [19, 19, 20, 22, 22, 21, 22, 16, 18, 18, 17, 14, 15, 16 , 16]
# 可以调用多次plot() 函数
plt.plot(x, y_max, marker='o', label='最高温度')
plt.plot(x, y_min, marker='o', label='最低温度')
# 为图表添加注释并设置字体的样式
x_temp = 4
for y_h, y_l in zip(y_max, y_min):
    plt.text(x_temp-0.3, y_h  + 0.7, y_h, family='SimHei', fontsize=8, fontstyle='normal')
    plt.text(x_temp-0.3, y_l  + 0.7, y_l, family='SimHei', fontsize=8, fontstyle='normal')
    x_temp  += 1
plt.title('未来15天最高气温和最低气温的走势')
plt.xlabel('日期')
plt.ylabel(r'温度($^\circ$C)')
plt.ylim(0, 40)
plt.legend()
plt.show()

输出如下:
在这里插入图片描述

4.6 切换主题风格

matplotlib.style模块中内置了一些图表的主题风格,通过切换不同的主题风格以满足用户的不同需求。所有的主题风格都存储于matplotlib配置文件夹的stylelib目录中,可以通过访问available变量查看所有可用的主题风格。

import matplotlib.style as ms
print(ms.available)

输出如下

[‘Solarize_Light2’, ‘_classic_test_patch’, ‘_mpl-gallery’, ‘_mpl-gallery-nogrid’, ‘bmh’, ‘classic’, ‘dark_background’, ‘fast’, ‘fivethirtyeight’, ‘ggplot’, ‘grayscale’, ‘petroff10’, ‘seaborn-v0_8’, ‘seaborn-v0_8-bright’, ‘seaborn-v0_8-colorblind’, ‘seaborn-v0_8-dark’, ‘seaborn-v0_8-dark-palette’, ‘seaborn-v0_8-darkgrid’, ‘seaborn-v0_8-deep’, ‘seaborn-v0_8-muted’, ‘seaborn-v0_8-notebook’, ‘seaborn-v0_8-paper’, ‘seaborn-v0_8-pastel’, ‘seaborn-v0_8-poster’, ‘seaborn-v0_8-talk’, ‘seaborn-v0_8-ticks’, ‘seaborn-v0_8-white’, ‘seaborn-v0_8-whitegrid’, ‘tableau-colorblind10’]

使用matplotlib.style中的use()函数可以切换图表的主题风格。
以上函数的参数style表示图表的主题风格,它可以接收matplotlib中所有可用的主题风格的字符串,也可以接收“default”来恢复默认的主题风格
在这里插入图片描述

plt.plot([1, 2, 3], [3, 4, 5], marker='*', markersize=20, markerfacecolor='y')
ms.use('seaborn-v0_8-deep')
# ms.use('seaborn-v0_8-talk')

输出如下:
在这里插入图片描述

4.7 填充区域

matplotlib中提供了多个函数用于填充多边形或区域,分别为fill()、fill_between()和fill_betweenx(),其中
fill()函数用于填充多边形
fill_between()函数用于填充两条水平曲线之间的区域
fill_betweenx()函数用于填充垂直曲线之间的区域

4.7.1 填充多边形或曲线之间的区域-fill() fill_between()和fill_betweenx()函数

fill()函数的语法格式如下所示:

fill(*args, data=None, facecolor, edgecolor, linewidth, **kwargs)

*args:表示x坐标、y坐标或颜色的序列。
facecolor:表示多边形的填充颜色
edgecolor:表示多边形的边框颜色
linewidth:表示多边形的边框宽度。

import matplotlib.pyplot as plt

# 保证 x 和 y 长度一致
x = [1, 2, 3, 4, 2]
y = [1, 3, 2, 3, 6]
# plt.fill(x, y)
plt.fill(x, y,'b', edgecolor='black', label='Blue Polygon')  # 使用默认颜色填充多边形
plt.show()

输出如下:
在这里插入图片描述

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 1]
y = [1, 4, 3, 4, 5]
x2 = [5, 6, 7, 8, 5]
y2 = [5, 8, 7, 8, 9]

# 填充多边形并设置边框
plt.fill(x, y, 'b', x2, y2, 'r',edgecolor='black', label='Blue Polygon')

# 设置坐标轴范围
plt.xlim(0, 9)
plt.ylim(0, 9)

# 添加标题和图例
plt.title('Polygon Filling with plt.fill')
plt.legend()

plt.show()

输出为:
在这里插入图片描述

fill_between()函数的语法格式如下所示:

fill_between(x, y1, y2=0, where=None, interpolate=False, step=None,  data=None, **kwargs)

x:表示x轴坐标的序列。
y1:表示第一条曲线的y轴坐标
y2:表示第二条曲线的y轴坐标
where:布尔值,表示要填充区域的条件。y1>y2说明第一条曲线位于第二条曲线上方时填充;y1<y2说明第二条曲线位于第一条曲线上方时填充。

fill_betweenx()函数的语法格式如下:

fill_betweenx(y, x1, x2=0, where=None, step=None, interpolate=False, data=None, **kwargs)

y:表示y轴坐标的序列。
x1:表示第一条曲线的x轴坐标
x2:表示第二条曲线的x轴坐标
where:布尔值,表示要填充区域的条件。x1>x2说明第一条曲线位于第二条曲线右方时填充;x1<x2说明第二条曲线位于第一条曲线右方时填充。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8 * np.pi, 1000)
sin_y = np.sin(x)
cos_y = np.cos(1.5 * x / np.pi) / 2
plt.plot(x, sin_y)
plt.plot(x, cos_y)
# 填充 fill_between参数
# 1. x轴数据
# 2. 第一条曲线y轴数据
# 3. 第二条曲线y轴数据
# 4. 填充区域的条件
# 5. 填充区域的颜色
plt.fill_between(x, cos_y, sin_y, cos_y < sin_y, color='dodgerblue', alpha=0.5)
plt.fill_between(x, cos_y, sin_y, cos_y > sin_y, color='orangered', alpha=0.5)

输出如下:
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8 * np.pi, 1000)
sin_y = np.sin(x)
cos_y = np.cos(1.5 * x / np.pi) / 2
plt.plot(x, sin_y)
plt.plot(x, cos_y)
# 填充 fill_between参数
# 1. x轴数据
# 2. 第一条曲线y轴数据
# 3. 第二条曲线y轴数据
# 4. 填充区域的条件
# 5. 填充区域的颜色
plt.fill_betweenx(x, cos_y, sin_y, cos_y < sin_y, color='dodgerblue', alpha=0.5)
plt.fill_betweenx(x, cos_y, sin_y, cos_y > sin_y, color='orangered', alpha=0.5)

输出如下:
在这里插入图片描述

4.7.2 实例5:彩色的“雪花”

科赫雪花又叫科赫曲线,科赫曲线是一种典型的分形曲线,形态似雪花,它是瑞典数学家科赫于1904年构造出来的。
在这里插入图片描述
一个边长为1的等边三角形,取每边中间的三分之一,接上去一个形状完全相似的但边长为其三分之一的三角形,结果是一个六角形。取六角形的每个边做同样的变换,即在中间三分之一接上更小的三角形,以此重复,直至无穷。外界的变得原来越细微曲折,形状接近理想化的雪花。

本实例要求读者绘制一个形状类似雪花的多边形,并给该多边形填充颜色。
在这里插入图片描述

# 05_colorful_snowflakes
import numpy as np
import matplotlib.pyplot as plt
def koch_snowflake(order, scale=10):
    def _koch_snowflake_complex(order):
        if order == 0:
            # 初始三角形
            angles = np.array([0, 120, 240]) + 90
            return scale / np.sqrt(3) * np.exp(np.deg2rad(angles)  * 1j)
        else:
            ZR = 0.5 - 0.5j  * np.sqrt(3) / 3
            p1 = _koch_snowflake_complex(order - 1)  # 起点
            p2 = np.roll(p1, shift=-1)               # 终点
            dp = p2 - p1                             # 连接向量
            new_points = np.empty(len(p1) * 4, dtype=np.complex128)
            new_points[::4] = p1
            new_points[1::4] = p1 + dp / 3
            new_points[2::4] = p1 + dp * ZR
            new_points[3::4] = p1 + dp / 3 * 2
            return new_points
    points = _koch_snowflake_complex(order)
    x, y = points.real, points.imag
    return x, y
x, y = koch_snowflake(order=2)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.fill(x, y, facecolor='lightsalmon', edgecolor='orangered', linewidth=3)
plt.show()

输出为:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS Master多设备连接

Bash Shell Shell是位于用户与操作系统内核之间的桥梁&#xff0c;当用户在终端敲入命令后&#xff0c;这些输入首先会进入内核中的tty子系统&#xff0c;TTY子系统负责捕获并处理终端的输入输出流&#xff0c;确保数据正确无误的在终端和系统内核之中。Shell在此过程不仅仅是…

系统思考:思考的快与慢

在做重大决策之前&#xff0c;什么原因一定要补充碳水化合物&#xff1f;人类的大脑其实有两套运作模式&#xff1a;系统1&#xff1a;自动驾驶模式&#xff0c;依赖直觉&#xff0c;反应快但易出错&#xff1b;系统2&#xff1a;手动驾驶模式&#xff0c;理性严谨&#xff0c;…

音视频入门基础:RTP专题(21)——使用Wireshark分析海康网络摄像机RTSP的RTP流

一、引言 使用vlc等播放器可以播放海康网络摄像机的RTSP流&#xff1a; 网络摄像机的RTSP流中&#xff0c;RTSP主要用于控制媒体流的传输&#xff0c;如播放、暂停、停止等操作。RTSP本身并不用于转送媒体流数据&#xff0c;而是会通过PLAY方法使用RTP来传输实际的音视频数据。…

04.游戏开发-unity编辑器详细-工具栏、菜单栏、工作识图详解

04.游戏开发&#xff0c;unity编辑器详细-工具栏、菜单栏、工作识图详解 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性&#xff0c;希…

QGIS中第三方POI坐标偏移的快速校正-百度POI

1.百度POI&#xff1a; name,lng,lat,address 龙记黄焖鸡米饭(共享区店),121.908315,30.886636,南汇新城镇沪城环路699弄117号(A1区110室) 好福记黄焖鸡(御桥路店),121.571409,31.162292,沪南路2419弄26号1层B间 御品黄焖鸡米饭(安亭店),121.160322,31.305977,安亭镇新源路792号…

Pycharm 启动时候一直扫描索引/更新索引 Update index/Scanning files to index

多个项目共用一个虚拟环境&#xff0c;有助于加快PyCharm 启动吗 chatgpt 4o认为很有帮助&#xff0c;gemini 2.5pro认为没鸟用&#xff0c;我更认可gemini的观点。不知道他们谁在一本正经胡说八道。 -------- 打开pycharm的时候&#xff0c;下方的进度条一直显示在扫描文件…

Vanna:用检索增强生成(RAG)技术革新自然语言转SQL

引言&#xff1a;为什么我们需要更智能的SQL生成&#xff1f; 在数据驱动的业务环境中&#xff0c;SQL 仍然是数据分析的核心工具。然而&#xff0c;编写正确的 SQL 查询需要专业知识&#xff0c;而大型语言模型&#xff08;LLM&#xff09;直接生成的 SQL 往往存在**幻觉&…

CKPT文件是什么?

检查点&#xff08;Checkpoint&#xff0c;简称ckpt&#xff09;是一种用于记录系统状态或数据变化的技术&#xff0c;广泛应用于数据库管理、机器学习模型训练、并行计算以及网络安全等领域。以下将详细介绍不同领域中ckpt检查点的定义、功能和应用场景。 数据库中的ckpt检查点…

Android使用OpenGL和MediaCodec录制

目录 一,什么是opengl 二,什么是Android OpenGL ES 三, OpenGL 绘制流程 四, OpenGL坐标系 五, OpenGL 着色器 六, GLSL编程语言 七,使用MediaCodec录制在Opengl中渲染架构 八,代码实现 8.1 自定义渲染view继承GLSurfaceView 8.2 自定义渲染器TigerRender 8.3 创建编…

《如何避免虚无》速读笔记

文章目录 书籍信息概览躺派&#xff08;出世&#xff09;卷派&#xff08;入世&#xff09;虚无篇&#xff1a;直面虚无自我篇&#xff1a;认识自我孤独篇&#xff1a;应对孤独幸福篇&#xff1a;追寻幸福超越篇&#xff1a;超越自我 书籍信息 书名&#xff1a;《如何避免虚无…

哈尔滨工业大学:大模型时代的具身智能

大家好&#xff0c;我是樱木。 机器人在工业领域&#xff0c;已经逐渐成熟。具身容易&#xff0c;智能难。 机器人-》智能机器人&#xff0c;需要自主能力&#xff0c;加上通用能力。 智能机器人-》人类&#xff0c;这个阶段就太有想象空间了。而最受关注的-类人机器人。 如何…

理解OSPF 特殊区域NSSA和各类LSA特点

本文基于上文 理解OSPF Stub区域和各类LSA特点 在理解了Stub区域之后&#xff0c;我们再来理解一下NSSA区域&#xff0c;NSSA区域用于需要引入少量外部路由&#xff0c;同时又需要保持Stub区域特性的情况 一、 网络总拓扑图 我们在R1上配置黑洞路由&#xff0c;来模拟NSSA区域…

如何通过优化HMI设计大幅提升产品竞争力?

一、HMI设计的重要性与竞争力提升 HMI&#xff08;人机交互界面&#xff09;设计在现代产品开发中扮演着至关重要的角色。良好的HMI设计不仅能够提升用户体验&#xff0c;还能显著增强产品的竞争力。在功能趋同的市场环境中&#xff0c;用户体验成为产品竞争的关键。HMI设计通…

Linux信号——信号的处理(3)

信号是什么时候被处理&#xff1f; 进程从内核态&#xff0c;切换到用户态的时候&#xff0c;信号会被检测处理。 内核态&#xff1a;操作系统的状态&#xff0c;权限级别高 用户态&#xff1a;你自己的状态 内核态和用户态 进程地址空间第三次 所谓的系统调用本质其实是一堆…

Pod的调度

在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某些节点上&…

LabVIEW面向对象编程设计方法

一、概述 面向对象编程&#xff08;OOP&#xff09;在软件开发中占据重要地位&#xff0c;尤其是在大规模软件项目中。它与小型程序开发思路不同&#xff0c;更注重未来功能的升级与扩展。在设计阶段&#xff0c;需思考如何构建既灵活又稳定的系统&#xff0c;这涉及众多设计方…

Dify票据识别遇到的分支判断不准确问题

已测试这篇文章中 https://zhuanlan.zhihu.com/p/5465385787 使用多分支条件判断使用不同的大模型识别图片内容 发现了细节问题。在使用时若不注意&#xff0c;分支会出现走向不准的问题。 需要关注部分 下方红框处。1&#xff0c;2后不能跟点。否则会出问。除此之外&#xff0…

《全栈+双客户端Turnkey方案》架构设计图

今天分享一些全栈双客户端Turnkey方案的架构与结构图。 1&#xff1a;三种分布式部署方案:网关方案&#xff0c;超级服务器单服方案&#xff0c;直连逻辑服方案 2: 单服多线程核心架构: 系统服务逻辑服服务 3: 系统服务的多线程池调度设计 4:LogicServer Update与ECS架构&…

某碰瓷国赛美赛,号称第三赛事的数模竞赛

首先我非常不能理解的就是怎么好意思自称第三赛事的呢&#xff1f;下面我们进行一个简单讨论&#xff0c;当然这里不对国赛和美赛进行讨论。首先我们来明确一点&#xff0c;比赛的含金量由什么来定&#xff1f;这个可能大家的评价指标可能不唯一&#xff0c;我通过DeepSeek选取…

【大模型深度学习】如何估算大模型需要的显存

一、模型参数量 参数量的单位 参数量指的是模型中所有权重和偏置的数量总和。在大模型中&#xff0c;参数量的单位通常以“百万”&#xff08;M&#xff09;或“亿”&#xff08;B&#xff0c;也常说十亿&#xff09;来表示。 百万&#xff08;M&#xff09;&#xff1a;表示…