d = np.array([1,2,4,10,20,95,130]) sig = np.array([250,185,137,86,95,33,25])画一个散点图
时间: 2023-09-29 12:08:23 浏览: 22
好的,我们可以使用 Matplotlib 库来绘制散点图。首先,需要安装 Matplotlib 库(如果还没有安装的话),可以使用以下命令安装:
```python
!pip install matplotlib
```
然后,可以使用以下代码来绘制散点图:
```python
import numpy as np
import matplotlib.pyplot as plt
d = np.array([1,2,4,10,20,95,130])
sig = np.array([250,185,137,86,95,33,25])
plt.scatter(d, sig)
plt.xlabel("d")
plt.ylabel("sig")
plt.show()
```
运行以上代码后,就可以得到散点图了。
相关问题
f = open('G:\jiont\比赛数据2022\charging_data79.csv', encoding='utf-8') data = pd.DataFrame(pd.read_csv(f, encoding='utf-8-sig', low_memory=False)) soc = np.array(data['standard_soc']) # 放电深度DoD current = np.array(data['total_current']) current = [ float(x)/10 for x in current ] all_vol = np.array(data['cell_volt_list']) mileage = np.array(data['mileage']) mileage = [ float(x)/10 for x in mileage ] all_sig_data = cycle_sig(all_vol) all_sig_data = clean_data(all_sig_data) def split_chargedata(chargr_data): a_data = [] all_data = [] for index, m in enumerate(mileage): if index + 1 < len(mileage): if m == mileage[index + 1]: a_data.append(chargr_data[index]) else: a_data.append(chargr_data[index]) all_data.append(a_data) a_data = [] else: all_data.append(a_data) return all_data all_charge_data = split_chargedata(all_sig_data) all_charge_current = split_chargedata(current) all_charge_soc = split_chargedata(soc) dod1 = [] for t in all_charge_soc: dod1.append(t[-1]-t[0]) ind = [] for ind1, t in enumerate(dod1): if t<10: ind.append(ind1) all_charge_data = np.delete(all_charge_data, ind, axis=0) all_charge_current = np.delete(all_charge_current, ind, axis=0) all_charge_soc = np.delete(all_charge_soc, ind, axis=0) ind9 = [5, 13, 25, 35, 47, 55, 81, 84, 86, 88, 89, 92, 94, 101, 111, 115, 116, 126, 157, 162, 167, 174, 180, 198, 200, 216, 237, 245, 261] all_charge_data = np.delete(all_charge_data, ind9, axis=0) all_charge_current = np.delete(all_charge_current, ind9, axis=0) all_charge_soc = np.delete(all_charge_soc, ind9, axis=0)
这段代码主要进行了一些数据处理的操作,包括:
1. 读取CSV文件中的数据,将SOC、电流、电压等数据存储到NumPy数组中。
2. 对电压数据进行了一些处理,使用了`cycle_sig`和`clean_data`函数。
3. 定义了`split_chargedata`函数,用于将数据按照里程数进行拆分,生成二维列表,其中每个子列表代表一次充电过程中的数据。
4. 使用`split_chargedata`函数对SOC、电流和电压数据进行拆分。
5. 计算了每个充电过程的DoD,并将DoD小于10%的充电过程的索引记录在`ind`列表中。
6. 使用`np.delete`函数删除`ind`列表中的充电过程对应的SOC、电流和电压数据。
7. 还对一些其他的充电过程进行了删除操作,对应的索引记录在`ind9`列表中。
总体来说,这段代码的作用是对充电数据进行了一些清洗和处理,去除了一些异常数据和不需要的充电过程。
from scipy import signal import numpy as np import matplotlib.pyplot as plt plt.rcParams["font.family"] = 'Arial Unicode MS' original_sig = np.loadtxt("resources/unbalanced.txt") original_sig -= np.mean(original_sig) N = len(original_sig) pi = np.pi f2_jw = np.fft.fft(original_sig) f2_jw = np.fft.fftshift(f2_jw) jw_list = [complex(0, 1) * 2 * pi / N * item for item in np.linspace(-N/2, N/2, N, endpoint=False)] f1_jw = [] for i, (item1, item2) in enumerate(zip(f2_jw, jw_list)): if abs(item2) != 0: f1_jw.append(item1/item2) else: f1_jw.append(complex(0, 0)) f1_jw = np.array(f1_jw) * 1000 # m到mm的量纲转换 f1_jw = np.fft.ifftshift(f1_jw) vel_sig = np.fft.ifft(f1_jw).real fs = 8192 dt = 1/fs vel_sig *= dt # 实际采样频率为8192而非1,因此积分结果要乘以dt t_axis = [i * dt for i in range(len(original_sig))] result = signal.detrend(vel_sig) plt.figure(figsize=(12, 3)) plt.subplot(121) plt.plot(t_axis, vel_sig, label="频域积分计算得到的速度信号") plt.legend(loc="upper right") plt.subplot(122) plt.plot(t_axis, result, label="频域积分后去趋势得到的速度信号") plt.legend(loc="upper right") plt.show()将这段代码使用C语言进行编写,原始样本长度为512,为实数,在进行FFT处理之前,原始样本设置为复数,虚部全部设置为0
以下是使用C语言编写的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979323846
void fft(double complex *x, int n) {
if (n == 1) return;
double complex xe[n/2], xo[n/2];
for (int i = 0; i < n/2; ++i) {
xe[i] = x[2*i];
xo[i] = x[2*i+1];
}
fft(xe, n/2);
fft(xo, n/2);
for (int i = 0; i < n/2; ++i) {
double complex t = cexp(-I * PI * i / (n/2)) * xo[i];
x[i] = xe[i] + t;
x[i+n/2] = xe[i] - t;
}
}
int main() {
double original_sig[512];
FILE *fp;
fp = fopen("resources/unbalanced.txt", "r");
for (int i = 0; i < 512; ++i) {
fscanf(fp, "%lf", &original_sig[i]);
original_sig[i] -= 0.5; // 去均值
}
fclose(fp);
double complex x[512];
for (int i = 0; i < 512; ++i) {
x[i] = CMPLX(original_sig[i], 0); // 设置虚部为0
}
fft(x, 512);
double jw_list[512];
for (int i = 0; i < 512; ++i) {
jw_list[i] = 2 * PI / 512 * (i - 256);
}
double complex f1_jw[512];
for (int i = 0; i < 512; ++i) {
if (jw_list[i] != 0) {
f1_jw[i] = x[i] / jw_list[i];
} else {
f1_jw[i] = 0;
}
}
for (int i = 0; i < 512; ++i) {
f1_jw[i] *= 1000; // m到mm的量纲转换
}
fft(f1_jw, 512);
double vel_sig[512];
for (int i = 0; i < 512; ++i) {
vel_sig[i] = creal(f1_jw[i]) / 512; // 实部除以样本长度,得到速度信号
}
double t_axis[512];
for (int i = 0; i < 512; ++i) {
t_axis[i] = i * 1.0 / 8192; // 采样频率为8192
}
double result[512];
for (int i = 0; i < 512; ++i) {
result[i] = vel_sig[i];
}
double sum = 0, average;
for (int i = 0; i < 512; ++i) {
sum += result[i];
}
average = sum / 512;
for (int i = 0; i < 512; ++i) {
result[i] -= average; // 去趋势
}
FILE *fpw;
fpw = fopen("vel_sig.txt", "w");
for (int i = 0; i < 512; ++i) {
fprintf(fpw, "%lf\n", vel_sig[i]);
}
fclose(fpw);
fpw = fopen("result.txt", "w");
for (int i = 0; i < 512; ++i) {
fprintf(fpw, "%lf\n", result[i]);
}
fclose(fpw);
return 0;
}
```
这段代码与Python代码实现的步骤基本相同,使用了C语言中的复数类型 `double complex` 和一些基本的数学函数。代码中还包含了读写文件的功能,将速度信号和去趋势后的速度信号分别写入了 `vel_sig.txt` 和 `result.txt` 文件中。
阅读全文