6.2 折线图及绘制属性

本文介绍了使用Matplotlib进行图表优化的方法,包括Figure与Axes对象的创建与配置、plot函数的参数设置、轴线的调整等,以实现美观且信息丰富的图表。

对6.1节生成的图形进行优化,首先引入数据集,示例代码:

import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)     
C, S = np.cos(X), np.sin(X)

6.2.1 Figure对象

通过pyplot模块中的figure()函数创建一个Figure(图表)对象,figsize参数指定Figure对象的宽度和高度,单位是英寸。此外还可以用dpi参数指定Figure对象的分辨率,即每英寸所表示的像素数,默认值为80,即创建的Figure对象的宽度为8*80=640个像素。示例代码:

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

同一个图表多条数据的绘制,示例代码

6.2.2 plot()函数

创建Figure对象之后,接下来调用plot()在当前的Figure对象中绘图。plot()的前两个参数分别表示X、Y轴数据的对象,本示例使用的是NumPy数组。使用关键字参数可以指定所绘制曲线的各种属性:

  • label:给曲线指定一个标签,此标签将在图示中显示。
  • color:指定曲线的颜色,颜色可以用英文单词或以'#'字符开头的6位十六进制数表示,例如'#ff0000'表示红色。或者使用值在0到1范围之内的三个元素的元组来表示,例如(1.0, 0.0, 0.0)页表示红色。
  • linestyle:指定曲线的形状,参数值可以是'-'表示实线,'--'表示虚线。
  • linewidth:指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw。

示例代码:

...
plt.plot(X, C, label="cosine", color="#ff0000", linewidth=2.5, linestyle="--")
plt.plot(X, S, label="sine", color="green", linewidth=2.5, linestyle="-")
plt.show()

综合以上代码,其运行结果图6-1所示:


图6-1


此外,也可以通过第三个参数'b--'指定曲线的颜色和线型,它通过一些易记的符号指定曲线的样式。其中'b'表示蓝色(blue),'--'表示线型为虚线。可以通过plt.plot?命令查看格式化字符串以及各个参数的详细说明。示例代码:

...
plt.plot(X, C, 'b--')
plt.plot(X, S, 'g-')
...

颜色字符缩写及对应颜色如下表所示:

字符颜色
bblue 蓝色
ggreen 绿色
rred 红色
ccyan 青色
mmagenta 品红色
yyellow 黄色
kblack 黑色
wwhite 白色

6.2.3 Axes对象的各个属性

实际上plot()函数是在Axes(子图)对象上绘图,如果当前的Figure对象没有Axes对象,将会为之创建一个几乎充满整个图表的Axes对象,并且使此Axes对象成为当前的Axes对象。可以通过一系列函数设置当前Axes对象的各个属性:

  • xlabel、ylabel:分别设置X、Y轴的标题文字。
  • title:设置子图的标题。
  • xlim、ylim:分别设置X、Y轴的显示范围。
  • xticks、yticks:分别设置X、轴的显示刻度。
  • legend:显示图例,即图中表示每条曲线的标签(label)和样式的矩形区域。其中,loc参数可以设置为英文方位单词如upper,middle,lower,left,center,right,或者采用best参数自适应图例位置。

示例代码:

...
plt.xlabel("independent variable")
plt.ylabel("dependent variable")
plt.xlim(-4.0, 4.0)
plt.ylim(-1.0, 1.0)
plt.xticks(np.linspace(-4, 4, 9, endpoint=True))
plt.yticks(np.linspace(-1, 1, 5, endpoint=True))
plt.legend(loc="upper left")
plt.show()

运行结果如图6-2所示:


图6-2


当前图形的边界有点紧凑,我们想要预留一些空间,以便清楚地查看所有数据点。可以利用xlim和ylim的属性进行设置,示例代码:

...
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)
...

此外,当前刻度不太理想,因为它们未显示正弦函数和余弦函数有趣的值,我们将更改它们,以便只显示这些值。示例代码:

...
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1, 0, +1])
...

刻度现在被正确放置,但是它们的标签不是很明确。我们可能猜测3.142代表π,它应该更好地使其明确出来。当我们设置刻度值时,我们还可以在第二个参数列表中提供相应的标签。在标签字符串的前后有字符'$',matplotlib会使用内嵌的LaTeX引擎将其显示为数学公式,允许标签更好地呈现出来。而使用LaTeX语法绘制数学公式会极大地降低图表的描绘速度。示例代码:

...
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])
...

6.2.4 轴线的设置

轴线是连接轴刻度线并且标记数据区域边界的线。 他们可以被放置在任意位置,直到现在,他们在轴的边界。 我们将改变它,因为我们想把它们放置在中间。 因为它有四个边界(顶部/底部/左侧/右侧),我们将它们的颜色设置为none来丢弃顶部和右侧边界,我们移动底部和左侧的边界将数据空间坐标变为原点。示例代码:

...
ax = plt.gca() # gca stands for 'get current axis'
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.show()

综合以上参数的示例代码:

import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)     
C, S = np.cos(X), np.sin(X)
plt.figure(figsize=(8, 6), dpi=80)
plt.plot(X, C, label="cosine", color="#ff0000", linewidth=2.5, linestyle="--")
plt.plot(X, S, label="sine", color="green", linewidth=2.5, linestyle="-")
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],  [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, +1],  [r'$-1$', r'$0$', r'$+1$'])
ax = plt.gca() 
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.legend(loc="upper left")
plt.show()

运行结果如图3所示:


图6-3

6.2.5 图表的输出和保存

最后调用plt.show()显示绘图窗口,也可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为test.png,并且通过dpi参数指定图像的分辨率为120,因此输出图像的宽度为8*120=960个像素。示例代码:

plt.savefig("test.png", dpi=120)

最后,可以通过help命令,查询相关方法的详细解释,示例代码:

print(help(plt.legend))
<think>好的,我现在需要帮用户解决如何用编程实现三因素四水平正交实验结果的折线图可视化的问题。首先,我得先理解用户的需求。三因素四水平正交实验,通常是指有三个因素,每个因素有四个水平,按照正交表设计的实验。用户想要将实验结果用折线图展示出来,可能需要比较不同因素在不同水平下对结果的影响。 接下来,我得考虑用户可能的编程语言偏好。用户提供的示例是Python代码,所以很可能希望用Python来实现。Python中的常用绘图库有Matplotlib和Seaborn,这里折线图的话,Matplotlib足够用了。不过,正交实验的数据结构可能需要先整理成DataFrame,所以Pandas也会用到。 然后,我需要回忆正交实验的数据结构。三因素四水平通常需要用到L16或L9正交表,不过具体正交表的选择可能取决于实验设计。但用户可能已经完成了实验,现在只需要可视化结果。因此,数据应该包含三个因素各自的水平值以及对应的实验结果。例如,每个因素有四个水平,可能用1到4表示,实验结果是一个数值。 接下来,绘制折线图的关键步骤是:1. 数据整理,可能需要计算每个因素在各水平下的均值或总和;2. 分别绘制每个因素在不同水平下的趋势。因为三个因素,可能需要三个子图,或者在同一个图中用不同颜色区分。 不过,用户提到的是折线图,通常折线图需要x轴是某个变量的连续变化,但因素的水平可能是离散的。这里可能需要将因素的水平作为x轴的离散点,连接成折线。例如,对于因素A,四个水平作为x轴的四个点,y轴是该水平下实验结果的均值,然后连成折线,同样处理因素B和C。 但如何在一个图中展示三个因素?可能需要三个子图,每个子图对应一个因素的趋势。或者,如果用户希望同时比较,可能需要将三个因素的折线放在同一图中,用不同颜色区分,但x轴可能需要处理。不过,因素的水平可能不同,所以放在同一图中可能不太合适,因此子图更合理。 接下来,编程步骤可能包括: 1. 导入必要的库,如Pandas处理数据,Matplotlib绘图。 2. 创建模拟数据,因为用户可能没有提供具体数据,需要示例数据。 3. 计算每个因素各水平下的均值。 4. 绘制三个子图,每个子图显示一个因素的水平与均值的关系。 然后,代码部分需要展示如何实现这些步骤。例如,使用Pandas的groupby来计算均值,用Matplotlib的subplots来创建子图,每个子图绘制一个因素的折线。 需要注意的是,用户可能对如何组织数据不太清楚,所以代码中需要展示数据结构的示例,比如DataFrame的列包括因素A、B、C和结果。然后分组计算每个因素各水平的平均结果。 另外,可能还需要考虑是否需要交互式可视化,但用户要求的是折线图,所以静态图即可。如果数据量很大,可能需要优化,但三因素四水平的数据量应该不大,所以不需要复杂处理。 最后,根据用户提供的引用,可能需要提到数据筛选和信息密度的问题,比如在可视化时保持清晰,避免重叠。例如引用[4]提到的信息密度,可能需要确保每个子图的信息不过载,颜色区分清晰等。 总结步骤: 1. 数据准备:整理成包含三个因素和结果的表格。 2. 计算各因素各水平的均值。 3. 使用Matplotlib创建子图,分别绘制每个因素的折线图。 4. 添加标签、标题等使图表清晰。</think>### 三因素四水平正交实验折线图编程实现步骤 #### 1. 数据准备 将实验结果整理为包含三列因素(例如`factor_A`, `factor_B`, `factor_C`)和一列结果(例如`result`)的表格,每行对应一次实验组合。例如: ```python import pandas as pd # 示例数据(需替换为实际数据) data = { 'factor_A': [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4], 'factor_B': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4], 'factor_C': [1, 2, 3, 4, 2, 1, 4, 3, 3, 4, 1, 2, 4, 3, 2, 1], 'result': [5.2, 6.1, 4.8, 5.5, 6.3, 5.9, 7.0, 6.2, 4.9, 5.7, 6.5, 5.8, 7.1, 6.8, 7.5, 6.0] } df = pd.DataFrame(data) ``` #### 2. 计算各因素水平均值 对每个因素分别计算其在各水平下的平均结果: ```python mean_A = df.groupby('factor_A')['result'].mean().reset_index() mean_B = df.groupby('factor_B')['result'].mean().reset_index() mean_C = df.groupby('factor_C')['result'].mean().reset_index() ``` #### 3. 绘制折线图 使用Matplotlib创建子图,分别展示三个因素的趋势: ```python import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 3, figsize=(15, 4)) # 绘制因子A的趋势 axes[0].plot(mean_A['factor_A'], mean_A['result'], marker='o', color='blue') axes[0].set_title('Factor A') axes[0].set_xlabel('Level') axes[0].set_ylabel('Mean Result') # 绘制因子B的趋势 axes[1].plot(mean_B['factor_B'], mean_B['result'], marker='s', color='green') axes[1].set_title('Factor B') axes[1].set_xlabel('Level') # 绘制因子C的趋势 axes[2].plot(mean_C['factor_C'], mean_C['result'], marker='^', color='red') axes[2].set_title('Factor C') axes[2].set_xlabel('Level') plt.tight_layout() plt.show() ``` #### 4. 关键说明 - **信息密度控制**:通过子图拆分三因素,避免视觉混乱[^4]。 - **离散水平处理**:x轴为离散水平值,折线仅表示趋势关联。 - **交互优化**:若需动态探索,可结合`Plotly`实现交互式图表[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值