{"spec_id":"spectrum-basic","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nspectrum-basic: Frequency Spectrum Plot\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 82/100 | Updated: 2026-05-14\n\"\"\"\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    annotation_logticks,\n    element_text,\n    geom_line,\n    ggplot,\n    labs,\n    scale_x_log10,\n    theme,\n    theme_minimal,\n)\n\n\n# Data: Create a synthetic signal with multiple frequency components\nnp.random.seed(42)\n\n# Sampling parameters\nsample_rate = 4096  # Hz\nduration = 1.0  # seconds\nn_samples = int(sample_rate * duration)\nt = np.linspace(0, duration, n_samples, endpoint=False)\n\n# Create signal with multiple frequency components\n# Simulating a mechanical vibration signal with fundamental and harmonics\nfundamental_freq = 50  # Hz (e.g., motor rotation)\nsignal = (\n    1.0 * np.sin(2 * np.pi * fundamental_freq * t)  # Fundamental\n    + 0.5 * np.sin(2 * np.pi * 2 * fundamental_freq * t)  # 2nd harmonic\n    + 0.25 * np.sin(2 * np.pi * 3 * fundamental_freq * t)  # 3rd harmonic\n    + 0.15 * np.sin(2 * np.pi * 500 * t)  # High frequency component\n    + 0.1 * np.random.randn(n_samples)  # Noise\n)\n\n# Compute FFT\nfft_result = np.fft.fft(signal)\nfrequencies = np.fft.fftfreq(n_samples, 1 / sample_rate)\n\n# Take positive frequencies only\npositive_mask = frequencies > 0\nfrequencies = frequencies[positive_mask]\namplitudes = np.abs(fft_result[positive_mask]) * 2 / n_samples\n\n# Convert to dB scale for better visualization\namplitudes_db = 20 * np.log10(amplitudes + 1e-10)\n\n# Create DataFrame for plotnine\ndf = pd.DataFrame({\"frequency\": frequencies, \"amplitude\": amplitudes_db})\n\n# Filter to relevant frequency range (10 Hz to 1000 Hz)\ndf = df[(df[\"frequency\"] >= 10) & (df[\"frequency\"] <= 1000)]\n\n# Create plot\nplot = (\n    ggplot(df, aes(x=\"frequency\", y=\"amplitude\"))\n    + geom_line(color=\"#306998\", size=1.2, alpha=0.9)\n    + scale_x_log10()\n    + annotation_logticks(sides=\"b\")\n    + labs(x=\"Frequency (Hz)\", y=\"Amplitude (dB)\", title=\"spectrum-basic · plotnine · pyplots.ai\")\n    + theme_minimal()\n    + theme(\n        figure_size=(16, 9),\n        plot_title=element_text(size=24, face=\"bold\"),\n        axis_title=element_text(size=20),\n        axis_text=element_text(size=16),\n        panel_grid_major=element_text(alpha=0.3),\n    )\n)\n\n# Save\nplot.save(\"plot.png\", dpi=300, verbose=False)\n"}