{"spec_id":"spectrum-basic","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nspectrum-basic: Frequency Spectrum Plot\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 72/100 | Updated: 2026-05-14\n\"\"\"\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\n\n\n# Data - Synthetic signal with multiple frequency components\nnp.random.seed(42)\n\n# Sampling parameters\nsample_rate = 1000  # Hz\nduration = 1.0  # seconds\nn_samples = int(sample_rate * duration)\n\n# Create time-domain signal with multiple frequency components\nt = np.linspace(0, duration, n_samples, endpoint=False)\n\n# Signal components: 50 Hz (dominant), 120 Hz (harmonic), 200 Hz (weak), plus noise\nsignal = (\n    1.0 * np.sin(2 * np.pi * 50 * t)  # 50 Hz - dominant frequency\n    + 0.5 * np.sin(2 * np.pi * 120 * t)  # 120 Hz - secondary component\n    + 0.25 * np.sin(2 * np.pi * 200 * t)  # 200 Hz - weak 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 only positive frequencies\npositive_mask = frequencies >= 0\nfrequencies = frequencies[positive_mask]\namplitude = np.abs(fft_result[positive_mask]) * 2 / n_samples  # Normalize\n\n# Convert to dB scale for better visualization\namplitude_db = 20 * np.log10(amplitude + 1e-10)  # Add small value to avoid log(0)\n\n# Create DataFrame\ndf = pd.DataFrame({\"Frequency (Hz)\": frequencies, \"Amplitude (dB)\": amplitude_db})\n\n# Filter to show relevant frequency range (0-300 Hz)\ndf = df[df[\"Frequency (Hz)\"] <= 300]\n\n# Create chart\nchart = (\n    alt.Chart(df)\n    .mark_line(color=\"#306998\", strokeWidth=2)\n    .encode(\n        x=alt.X(\"Frequency (Hz):Q\", title=\"Frequency (Hz)\", scale=alt.Scale(domain=[0, 300])),\n        y=alt.Y(\"Amplitude (dB):Q\", title=\"Amplitude (dB)\", scale=alt.Scale(domain=[-80, 10])),\n        tooltip=[alt.Tooltip(\"Frequency (Hz):Q\", format=\".1f\"), alt.Tooltip(\"Amplitude (dB):Q\", format=\".1f\")],\n    )\n    .properties(\n        width=1600, height=900, title=alt.Title(\"spectrum-basic · altair · pyplots.ai\", fontSize=28, anchor=\"middle\")\n    )\n    .configure_axis(labelFontSize=18, titleFontSize=22, grid=True, gridColor=\"#cccccc\", gridOpacity=0.3)\n    .configure_view(strokeWidth=0)\n    .configure_title(fontSize=28)\n)\n\n# Save as PNG and HTML\nchart.save(\"plot.png\", scale_factor=3.0)\nchart.save(\"plot.html\")\n"}