用python写一个基于直方图比图的代码
时间: 2023-02-06 09:56:50 浏览: 162
好的,这是一个使用 Python 实现基于直方图比较的示例代码:
```
import matplotlib.pyplot as plt
# 假设有两组数据
data1 = [1, 2, 3, 4, 5]
data2 = [2, 4, 6, 8, 10]
# 绘制直方图
plt.hist([data1, data2], bins=5, rwidth=0.8)
# 设置图表标题并给坐标轴加上标签
plt.title('Histogram Comparison')
plt.xlabel('Data')
plt.ylabel('Frequency')
# 添加图例
plt.legend(['Data 1', 'Data 2'])
# 显示图表
plt.show()
```
在这个代码中,我们使用了 Matplotlib 库中的 `hist` 函数来绘制直方图。我们向 `hist` 函数传递了两组数据和直方图的 bin 数,并使用 `rwidth` 参数调整直方图的宽度。然后,我们使用 `title`、`xlabel` 和 `ylabel` 函数为图表设置标题和坐标轴标签,并使用 `legend` 函数为图表添加图例。最后,我们使用 `show` 函数显示图表。
希望这对您有帮助!
相关问题
用模拟原型法设计法与窗函数法分别设计一个 IIR 和 FIR 低通滤波器 F1, F2,并满足性能指标:通带边界归一化频率 wp=0.5,阻带边界归一化频 率 ws=0.6,阻带衰减不小于 40dB,通带波纹不大于 3dB。假设一个信号 S,其中 f1=8Hz,f2=21Hz。信号采样频率为 50Hz。试将原信号与通过滤 波器的信号进行比较。 要求: (1)分别给出 IIR 和 FIR 滤波器的 MATLAB 代码。 (2)分别画出 IIR 和 FIR 滤波器的幅频、相频图,以及滤波前后时域对 比图。 (3) 其中窗函数法需说明选择了哪种窗函数,并解释原因。 (4)对比分析 IIR 与 FIR 滤波结果的异同
(1) IIR 滤波器设计代码:
```matlab
wp = 0.5; % 通带边界归一化频率
ws = 0.6; % 阻带边界归一化频率
Rp = 3; % 通带最大波纹
Rs = 40; % 阻带最小衰减
% 使用 Butterworth 模拟原型法设计 IIR 滤波器
[n, Wn] = buttord(wp, ws, Rp, Rs, 's');
[b, a] = butter(n, Wn, 's');
```
FIR 滤波器设计代码:
```matlab
wp = 0.5; % 通带边界归一化频率
ws = 0.6; % 阻带边界归一化频率
Rp = 3; % 通带最大波纹
Rs = 40; % 阻带最小衰减
N = 40; % FIR 滤波器阶数
% 使用 Hamming 窗函数设计 FIR 滤波器
b = fir1(N, wp, 'low', hamming(N+1));
```
(2) 幅频响应和相频响应以及滤波前后时域对比图:
IIR 滤波器:
```matlab
% IIR 滤波器幅频响应和相频响应
[H, w] = freqz(b, a);
figure;
subplot(2,1,1);
plot(w/pi, 20*log10(abs(H)));
title('IIR Lowpass Filter Magnitude Response');
xlabel('Frequency (Normalized)');
ylabel('Magnitude (dB)');
ylim([-50, 10]);
subplot(2,1,2);
plot(w/pi, angle(H)/pi);
title('IIR Lowpass Filter Phase Response');
xlabel('Frequency (Normalized)');
ylabel('Phase (pi)');
% 滤波前后时域对比
t = 0:0.02:2;
s = sin(2*pi*8*t) + sin(2*pi*21*t);
figure;
subplot(2,1,1);
plot(t, s);
title('Original Signal');
xlabel('Time (sec)');
ylabel('Amplitude');
y = filter(b, a, s);
subplot(2,1,2);
plot(t, y);
title('Filtered Signal (IIR)');
xlabel('Time (sec)');
ylabel('Amplitude');
```
FIR 滤波器:
```matlab
% FIR 滤波器幅频响应和相频响应
[H, w] = freqz(b, 1);
figure;
subplot(2,1,1);
plot(w/pi, 20*log10(abs(H)));
title('FIR Lowpass Filter Magnitude Response');
xlabel('Frequency (Normalized)');
ylabel('Magnitude (dB)');
ylim([-50, 10]);
subplot(2,1,2);
plot(w/pi, angle(H)/pi);
title('FIR Lowpass Filter Phase Response');
xlabel('Frequency (Normalized)');
ylabel('Phase (pi)');
% 滤波前后时域对比
t = 0:0.02:2;
s = sin(2*pi*8*t) + sin(2*pi*21*t);
figure;
subplot(2,1,1);
plot(t, s);
title('Original Signal');
xlabel('Time (sec)');
ylabel('Amplitude');
y = filter(b, 1, s);
subplot(2,1,2);
plot(t, y);
title('Filtered Signal (FIR)');
xlabel('Time (sec)');
ylabel('Amplitude');
```
(3) 窗函数的选择:
这里使用了 Hamming 窗函数设计 FIR 滤波器。Hamming 窗函数在频域上的副瓣衰减比 Hann 窗函数更快,因此可以实现更好的滤波特性。而且 Hamming 窗函数的主瓣宽度比 Blackman 窗函数更窄,可以实现更好的频域分辨率。
(4) IIR 与 FIR 滤波结果的异同:
从幅频响应图和时域对比图可以看出,IIR 滤波器和 FIR 滤波器都能够实现对原始信号的低通滤波。IIR 滤波器的通带和阻带过渡带宽度较窄,能够实现更陡峭的滤波特性。但是IIR滤波器的相位响应不是线性的,可能会引入相位失真。FIR 滤波器的通带和阻带过渡带宽度较宽,因此滤波器阶数需要增加才能实现与IIR相同的滤波特性,但FIR滤波器的相位响应是线性的,可以保持信号的相位信息。在实际应用中,需要根据具体的信号特征和滤波要求来选择合适的滤波器类型。
df1 = df[df['类型是否高钾']==0] plt.figure(figsize=(10,10)) data = df1[df1.columns[5:]].mean() print(data[data<=1].index) value = list(data[data>1].values)+[sum(data[data<=1].values)] labels = list(data[data>1].index)+['其他'] plt.pie(value, labels=labels, autopct='%1.2lf%%') plt.savefig('类型为高钾的成分占比图.png') plt.show() 这是画扇形图的代码,请大致说明其中的含义
这段代码主要是用来绘制一个扇形图,展示了数据框(df)中“类型是否高钾”列值为0的数据子集的成分占比。
首先,通过`df[df['类型是否高钾']==0]`筛选出“类型是否高钾”列值为0的数据子集,并赋值给变量`df1`。
接下来,创建一个大小为10x10的画布,使用`plt.figure(figsize=(10,10))`语句。
然后,计算`df1`中第5列及之后列的平均值,将结果赋值给变量`data`。
通过`data[data<=1].index`可以获取`data`中小于等于1的值所对应的索引(即列名),并使用`print()`函数打印出来。
将大于1的值取出来,并添加一个总和值(即小于等于1的值的和),存储在列表`value`中。
同样,将大于1的索引(列名)取出来,并添加一个“其他”的标签,存储在列表`labels`中。
接下来,使用`plt.pie()`函数绘制扇形图,传入参数`value`和`labels`,并使用`autopct='%1.2lf%%'`设置扇形图上显示的百分比格式。
使用`plt.savefig('类型为高钾的成分占比图.png')`保存生成的扇形图为文件名为“类型为高钾的成分占比图.png”的图片。
最后,使用`plt.show()`显示绘制的扇形图。
阅读全文