如何用脚本生成数据曲线图

wen 实用脚本 2

本文目录导读:

如何用脚本生成数据曲线图

  1. Python + Matplotlib(最常用)
  2. Python + Plotly(交互式图表)
  3. JavaScript + Chart.js (Web图表)
  4. Bash + GnuPlot(命令行)
  5. 实用工具:从CSV生成图表
  6. 自动化脚本模板
  7. 使用建议

我来介绍几种生成数据曲线图的脚本方案,包括Python、JavaScript和命令行工具。

Python + Matplotlib(最常用)

基础折线图

import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建图表
plt.figure(figsize=(10, 6))
plt.plot(x, y1, label='sin(x)', linewidth=2)
plt.plot(x, y2, label='cos(x)', linewidth=2)
和标签'正弦和余弦曲线', fontsize=14)
plt.xlabel('x 值', fontsize=12)
plt.ylabel('y 值', fontsize=12)
plt.legend()
plt.grid(True, alpha=0.3)
# 保存或显示
plt.savefig('curve.png', dpi=300, bbox_inches='tight')
plt.show()

多子图曲线

import matplotlib.pyplot as plt
import numpy as np
# 创建2x2子图
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(12, 10))
x = np.linspace(0, 4*np.pi, 500)
# 子图1:基本曲线
ax1.plot(x, np.sin(x), 'b-', linewidth=2)
ax1.set_title('正弦波')
ax1.set_xlabel('时间')
ax1.set_ylabel('振幅')
# 子图2:多条曲线对比
ax2.plot(x, np.sin(x), 'r-', label='sin')
ax2.plot(x, np.cos(x), 'g--', label='cos')
ax2.legend()
ax2.set_title('sin vs cos')
# 子图3:散点+曲线
y = np.sin(x) + np.random.randn(500)*0.1
ax3.scatter(x, y, s=5, alpha=0.5)
ax3.plot(x, np.sin(x), 'r-', linewidth=2)
ax3.set_title('带噪声的数据')
# 子图4:填充区域
ax4.plot(x, np.sin(x))
ax4.fill_between(x, np.sin(x), 0, alpha=0.3)
ax4.set_title('填充曲线')
plt.tight_layout()
plt.show()

Python + Plotly(交互式图表)

import plotly.graph_objects as go
import numpy as np
# 生成数据
x = np.linspace(0, 20, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
# 创建交互式图表
fig = go.Figure()
# 添加曲线
fig.add_trace(go.Scatter(x=x, y=y1, mode='lines', name='sin'))
fig.add_trace(go.Scatter(x=x, y=y2, mode='lines', name='cos'))
fig.add_trace(go.Scatter(x=x, y=y3, mode='lines', name='tan'))
# 更新布局
fig.update_layout('交互式曲线图',
    xaxis_title='X轴',
    yaxis_title='Y轴',
    hovermode='x'
)
# 保存为HTML(可交互)
fig.write_html('interactive_curve.html')
# 显示
fig.show()

JavaScript + Chart.js (Web图表)

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
    <canvas id="myChart" style="max-width: 800px; margin: auto;"></canvas>
    <script>
        // 生成演示数据
        const generateData = () => {
            const data = [];
            for (let i = 0; i < 50; i++) {
                data.push({
                    x: i,
                    y: Math.sin(i/5) + Math.random()*0.2
                });
            }
            return data;
        };
        const ctx = document.getElementById('myChart').getContext('2d');
        const chart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: Array.from({length: 50}, (_, i) => i),
                datasets: [{
                    label: '正弦波',
                    data: generateData().map(d => d.y),
                    borderColor: 'rgb(75, 192, 192)',
                    backgroundColor: 'rgba(75, 192, 192, 0.2)',
                    tension: 0.1
                }]
            },
            options: {
                responsive: true,
                plugins: {
                    title: {
                        display: true,
                        text: '数据曲线图'
                    }
                },
                scales: {
                    y: {
                        beginAtZero: true
                    }
                }
            }
        });
        // 动态更新数据
        setInterval(() => {
            chart.data.datasets[0].data = generateData().map(d => d.y);
            chart.update();
        }, 2000);
    </script>
</body>
</html>

Bash + GnuPlot(命令行)

#!/bin/bash
# 创建数据文件
cat > data.txt << EOF
1 5
2 3
3 8
4 6
5 11
6 9
7 13
8 17
EOF
# Gnuplot脚本
gnuplot << EOF
set terminal png size 800,600
set output 'gnuplot_curve.png''数据曲线图'
set xlabel 'X轴'
set ylabel 'Y轴'
set grid
# 绘制点图
plot 'data.txt' with points title '数据点' pt 7 ps 2 lc rgb 'blue', \
     'data.txt' smooth bezier with lines title '平滑曲线' lw 2 lc rgb 'red'
EOF
echo "图表已生成: gnuplot_curve.png"

实用工具:从CSV生成图表

import pandas as pd
import matplotlib.pyplot as plt
import sys
def plot_csv(filepath, x_column, y_columns, title='数据曲线图'):
    """
    从CSV文件生成曲线图
    参数:
    filepath: CSV文件路径
    x_column: X轴列名
    y_columns: Y轴列名列表 图表标题
    """
    # 读取数据
    df = pd.read_csv(filepath)
    # 创建图表
    plt.figure(figsize=(12, 6))
    for col in y_columns:
        plt.plot(df[x_column], df[col], 
                marker='o', markersize=3, 
                label=col, linewidth=1.5)
    plt.title(title)
    plt.xlabel(x_column)
    plt.ylabel('值')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    # 保存图表
    output_file = 'output_curve.png'
    plt.savefig(output_file, dpi=300)
    print(f"图表已保存: {output_file}")
# 使用示例
if __name__ == "__main__":
    # 创建演示数据
    import numpy as np
    data = {
        'time': np.linspace(0, 10, 100),
        'temperature': 20 + 10*np.sin(np.linspace(0, 2*np.pi, 100)),
        'humidity': 50 + 20*np.cos(np.linspace(0, 2*np.pi, 100))
    }
    pd.DataFrame(data).to_csv('sample_data.csv', index=False)
    # 生成图表
    plot_csv('sample_data.csv', 'time', 
             ['temperature', 'humidity'], 
             '环境和湿度变化')

自动化脚本模板

#!/usr/bin/env python3
"""
通用数据可视化脚本
用法: python plotter.py data.csv output.png
"""
import matplotlib.pyplot as plt
import pandas as pd
import sys
import os
class DataVisualizer:
    def __init__(self, filepath):
        self.df = pd.read_csv(filepath)
    def generate_curve(self, x_col, y_cols, title, output_path):
        """生成曲线图"""
        fig, ax = plt.subplots(figsize=(12, 6))
        for y_col in y_cols:
            ax.plot(self.df[x_col], self.df[y_col], 
                   label=y_col, linewidth=2)
        ax.set_xlabel(x_col)
        ax.set_ylabel('值')
        ax.set_title(title)
        ax.legend()
        ax.grid(True, alpha=0.3)
        plt.tight_layout()
        plt.savefig(output_path, dpi=300)
        plt.close()
        print(f"✓ 图表已生成: {output_path}")
    def generate_multi_plot(self, config):
        """生成多图"""
        n = len(config)
        fig, axes = plt.subplots(1, n, figsize=(6*n, 4))
        for i, (name, y_col) in enumerate(config.items()):
            axes[i].plot(self.df.index, self.df[y_col])
            axes[i].set_title(name)
            axes[i].grid(True)
        plt.tight_layout()
        return fig
# 主程序
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("用法: python plotter.py data.csv [output.png]")
        sys.exit(1)
    data_file = sys.argv[1]
    output_file = sys.argv[2] if len(sys.argv) > 2 else 'output.png'
    # 创建可视化器
    visualizer = DataVisualizer(data_file)
    # 生成图表
    visualizer.generate_curve(
        x_col='x',           # 根据实际数据修改
        y_cols=['y1', 'y2'], # 根据实际数据修改
        title='自动生成的数据曲线',
        output_path=output_file
    )

使用建议

  1. 快速可视化:使用Matplotlib(Python)或GnuPlot(命令行)
  2. 交互式需求:Plotly(Python)或Chart.js(Web)
  3. 数据探索:建议使用Jupyter Notebook + Matplotlib
  4. 自动化报表:使用上述脚本模板批量处理
  5. 大数据量:考虑使用seaborn或bokeh优化性能

这些脚本可以直接复制使用,只需根据你的数据格式调整参数即可,需要更具体的定制吗?

抱歉,评论功能暂时关闭!