python - Matplotlib 的网格和限制问题
问题描述
我试图使用 Matplotlib 为下面给出的参数创建一个正弦波图。
创建一个宽 12 英寸,高 3 英寸的图形。将其命名为图。
使用 add_subplot 创建与图 fig 关联的轴。将其命名为斧头。
创建一个 numpy 数组 t,其中包含 200 个介于 0.0 和 2.0 之间的值。使用 'linspace' 方法生成 200 个值。
创建一个 numpy 数组 v,使得 v = np.sin(2.5 np.pi t)。
将 t 和 v 作为变量传递给绘图函数并绘制一条穿过选定 200 个点的红线。将线标记为 sin(t)。
将 X 轴标记为时间(秒)。
将 Y 轴标记为电压 (mV)。
将标题设置为正弦波。
将 X 轴上的数据限制为 0 到 2。
将 Y 轴上的数据限制在 -1 到 1 之间。
将 X 轴上的主要刻度标记为 0、0.2、0.4、0.6、0.8、1.0、1.2、1.4、1.6、1.8 和 2.0。
在 -1、0 和 1 处标记 Y 轴上的主要刻度。
添加一个网格,其线型为“--”。
添加图例。
写了下面,它几乎是按要求来的,但预期的图表与我写的略有不同。我确实给出了 x 和 y 限制,但图表似乎比这更进一步。
import numpy as np
import matplotlib.ticker as ticker
fig = plt.figure(figsize=(12,3))
ax = fig.add_subplot(111)
t = np.linspace(0.0,2.0,200)
v = np.sin(2.5*np.pi*t)
ax.set(title='Sine Wave', xlabel='time (seconds)', ylabel='Voltage (mV)', xlim = (0,2), ylim=(-1,1))
xmajor = [0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0]
ymajor = [-1,0,1]
ax.xaxis.set_major_formatter(ticker.FixedFormatter(xmajor))
ax.yaxis.set_major_formatter(ticker.FixedFormatter(ymajor))
plt.plot(t, v, label='sin(t)',color = 'red')
plt.legend()
plt.rc('grid', linestyle='--', color='black')
plt.grid(True)
plt.show()
这里有几点
- 轴不限于我提供的内容
- 网格似乎有所不同。
请有任何解决方法的想法。
解决方案
您的问题与ticker.FixedFormatter
. 首先,考虑这个解决方案:
import numpy as np
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,3))
ax = fig.add_subplot(111)
t = np.linspace(0.0,2.0,200)
v = np.sin(2.5*np.pi*t)
ax.set(title='Sine Wave', xlabel='time (seconds)', ylabel='Voltage (mV)', xlim = (0,2), ylim=(-1,1))
plt.xticks([0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0])
plt.yticks([-1, 0, 1])
plt.plot(t, v, label='sin(t)',color = 'red')
plt.legend()
ax.grid(color='black', linestyle='--', dashes=[8, 6], alpha=0.5)
plt.grid(True)
plt.show()
结果如下图:
请注意,我更改ax.xaxis.set_major_formatter
为plt.xticks
允许您直接操作 xticks。
您使用FixedFormatter
,这意味着刻度位置是固定的,您只需命名它们 - 这就是为什么 yaxis 上的前 3 个刻度为 -1、0、1(您的输入),而不管它们的值是什么。除非您有充分的理由使用matplotlib.ticker
(也就是设置刻度的位置或格式化它们),否则我建议使用 simpleplt.xticks
来设置它们的值。
第二个变化是通过使用而不是绘制矩形来直接控制网格ax.grid
,我认为这更正确。由于您在虚线上的请求非常具体(默认“--”与您要求的不同),我添加了dashed=[float, float]
param. 它允许您控制破折号的大小 - 您可以根据需要操作它们。添加了alpha
参数以赋予它更多“灰色”风格,但您可以将其删除
推荐阅读
- python - 带有关系数据的 Django 模型表单提交
- sql - PLS-00302:必须声明组件“VARIABLE_SKU_ID”
- java - 如何获取用户输入并转换为使用泛型类型类所需的类型?
- reactjs - 反应改变状态
- excel - 你能有一个既是工作簿又是字符串的变量吗?
- vue.js - 在 v-for 后跟 v-if 的基础上在 Vue JS 中添加 CSS 类
- angular - ngClass 指令条件 else 或 ? 'class1':'class2'
- python - Jenkins Python 作业因“ImportError ...”而失败,但在相同的分支上成功构建
- sql - 将文本转换为数字以进行客户满意度调查
- ms-access - 如何在我的情况下进行自定义舍入功能?