你是不是也厌倦了默认配色的“土味”图表?是不是看到别人作业里那些清新、高级、有设计感的可视化就忍不住收藏?
今天,我们不仅教大家审美,更直接送上多套完整代码!复制粘贴即可运行,带你从零开始复刻那些“别人家的图表”。
🛠️ 准备工作
在开始之前,请确保你的环境已安装以下库:
pip install matplotlib numpy seaborn plotly
📊 图1:小气泡图 (Small Bubble Chart)
特点:色彩渐变温柔治愈,透明度让重叠区域更自然。
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体(防止乱码,根据系统调整,Windows常用SimHei,Mac常用Arial Unicode MS)plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False# 1. 生成数据np.random.seed(42)x = np.random.rand(50)y = np.random.rand(50)colors = np.random.rand(50) # 颜色映射值sizes = np.random.rand(50) * 500 # 气泡大小# 2. 创建画布plt.figure(figsize=(8, 6))# 3. 绘制散点图# cmap='RdBu_r' 是红蓝反向渐变,alpha控制透明度,edgecolors给气泡加白边scatter = plt.scatter(x, y, s=sizes, c=colors, cmap='RdBu_r', alpha=0.6, edgecolors='white', linewidth=1.5)# 4. 添加颜色条cbar = plt.colorbar(scatter)cbar.set_label('数值强度', fontsize=12)# 5. 美化细节plt.title('小气泡图:渐变与透明度的艺术', fontsize=16, pad=20)plt.xlabel('X 轴', fontsize=12)plt.ylabel('Y 轴', fontsize=12)plt.grid(True, linestyle='--', alpha=0.3)# 6. 显示图表plt.tight_layout()plt.show()
运行效果:
🌀 图2:3D螺旋曲线 (3D Helix Plot)
特点:科技感拉满,沿路径渐变的色彩让空间感更强。
import matplotlib.pyplot as pltimport numpy as npfrom mpl_toolkits.mplot3d import Axes3D# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 1. 生成数据t = np.linspace(0, 4 * np.pi, 100)x = np.sin(t)y = np.cos(t)z = t / (4 * np.pi) - 0.5 # 高度归一化# 2. 创建3D画布fig = plt.figure(figsize=(9, 7))ax = fig.add_subplot(111, projection='3d')# 3. 绘制散点(模拟曲线)# c=t 实现沿路径颜色渐变,cmap='plasma' 是紫粉梦幻风sc = ax.scatter(x, y, z, c=t, cmap='plasma', marker='^', s=50, edgecolors='none')# 4. 添加颜色条cbar = fig.colorbar(sc, ax=ax, shrink=0.6)cbar.set_label('时间参数 t', fontsize=12)# 5. 设置标签和标题ax.set_xlabel('X 轴', fontsize=12)ax.set_ylabel('Y 轴', fontsize=12)ax.set_zlabel('Z 轴', fontsize=12)ax.set_title('3D螺旋曲线:科技感的空间演绎', fontsize=16, pad=20)# 6. 调整视角 (可选)ax.view_init(elev=20, azim=-60)plt.tight_layout()plt.show()
运行效果:
📉 图3:三角函数阴影面积图 (Shaded Line Plot)
特点:文艺范十足,智能填充两条曲线之间的区域。
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 1. 生成数据x = np.linspace(0, 2 * np.pi, 400)sin_x = np.sin(x)cos_x = np.cos(x)# 2. 创建画布plt.figure(figsize=(10, 6))# 3. 绘制曲线plt.plot(x, sin_x, label='sin(x)', color='#2c3e50', linewidth=2)plt.plot(x, cos_x, label='cos(x)', color='#27ae60', linewidth=2)# 4. 填充区域 (核心技巧)# where=(sin_x >= cos_x): 只在sin大于cos的区域填充plt.fill_between(x, sin_x, cos_x, where=(sin_x >= cos_x), interpolate=True, color='#3498db', alpha=0.2, label='sin > cos')plt.fill_between(x, sin_x, cos_x, where=(sin_x < cos_x), interpolate=True, color='#e74c3c', alpha=0.2, label='sin < cos')# 5. 美化细节plt.legend(loc='upper right', frameon=False)plt.xlabel('X 轴 (弧度)', fontsize=12)plt.ylabel('函数值', fontsize=12)plt.title('三角函数阴影面积:谁大谁小一目了然', fontsize=16, pad=20)plt.grid(True, alpha=0.3, linestyle='--')# 设置X轴刻度为π的倍数plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi], ['0', 'π/2', 'π', '3π/2', '2π'])plt.tight_layout()plt.show()
运行效果:
🔥 图4:热力图矩阵 (Heatmap Matrix)
特点:数据密度一目了然,自动判断文字颜色保证可读性。
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 1. 生成数据 (7行9列的随机矩阵)np.random.seed(42)data = np.random.rand(7, 9).round(2)# 2. 创建画布plt.figure(figsize=(10, 6))# 3. 绘制热力图# cmap='RdYlBu_r' 是红黄蓝反向,适合表现高低差异im = plt.imshow(data, cmap='RdYlBu_r', aspect='auto')# 4. 添加颜色条cbar = plt.colorbar(im)cbar.set_label('数值大小', fontsize=12)# 5. 添加数值标注 (核心技巧:根据背景深浅自动切换黑白字)for i in range(7): for j in range(9): text_color = 'white' if data[i, j] > 0.5 else 'black' plt.text(j, i, f'{data[i, j]:.2f}', ha='center', va='center', color=text_color, fontsize=10, weight='bold')# 6. 设置刻度和标题plt.xticks(range(9), [f'Col {j+1}' for j in range(9)])plt.yticks(range(7), [f'Row {i+1}' for i in range(7)])plt.title('热力图矩阵:数据密度的视觉呈现', fontsize=16, pad=20)plt.tight_layout()plt.show()
运行效果:
📦 图5:自定义箱线图 (Customized Box Plot)
特点:分组对比清晰有力,莫兰迪色系让统计图不再枯燥。
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 1. 生成数据np.random.seed(42)groups = ['组别 A', '组别 B', '组别 C', '组别 D']data = [np.random.randn(100) + i for i in range(4)]# 2. 定义配色 (莫兰迪色系)colors = ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3']# 3. 创建画布plt.figure(figsize=(10, 6))# 4. 绘制箱线图# patch_artist=True 是关键,允许给箱体填充颜色bp = plt.boxplot(data, labels=groups, patch_artist=True, widths=0.6, showmeans=True, meanline=True)# 5. 自定义箱体颜色for patch, color in zip(bp['boxes'], colors): patch.set_facecolor(color) patch.set_edgecolor('black') patch.set_linewidth(1.5)# 自定义中位数线for median in bp['medians']: median.set_color('black') median.set_linewidth(2)# 6. 美化细节plt.ylabel('数值分布', fontsize=12)plt.title('自定义箱线图:多组数据分布对比', fontsize=16, pad=20)plt.grid(axis='y', alpha=0.3, linestyle='--')plt.axhline(0, color='gray', linewidth=0.8, linestyle='-') # 参考线plt.tight_layout()plt.show()
运行效果:
📈 图6:多函数叠加比较图 (Multi-Function Comparison)
特点:动态区间标注,多种线型组合,信息丰富但不杂乱。
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 1. 生成数据x = np.linspace(0, 4 * np.pi, 400)sin_x = np.sin(x)cos_x = np.cos(x)# 2. 创建画布plt.figure(figsize=(12, 6))# 3. 绘制多条曲线 (不同线型)plt.plot(x, sin_x, '--', label='Sin(x)', color='#3498db', linewidth=2)plt.plot(x, cos_x, ':', label='Cos(x)', color='#e74c3c', linewidth=2)# 4. 填充差异区域plt.fill_between(x, sin_x, cos_x, where=(sin_x >= cos_x), color='#3498db', alpha=0.15, label='Sin ≥ Cos')plt.fill_between(x, sin_x, cos_x, where=(sin_x < cos_x), color='#e74c3c', alpha=0.15, label='Sin < Cos')# 5. 添加零轴参考线plt.axhline(0, color='gray', linewidth=1, linestyle='-')# 6. 美化细节plt.legend(loc='upper right', frameon=False, fontsize=12)plt.xlabel('X 轴 (弧度)', fontsize=12)plt.title('多函数叠加比较:周期与区间的博弈', fontsize=16, pad=20)plt.grid(True, alpha=0.3, linestyle='--')# 限制Y轴范围,让波形更饱满plt.ylim(-1.5, 1.5)plt.tight_layout()plt.show()
运行效果:
🌊 图7:带噪声的面积图 (Area Chart with Noise)
特点:随机中见秩序,模拟真实数据的波动感。
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 1. 生成数据x = np.linspace(0, 5 * np.pi, 200)# 添加随机噪声noise1 = np.random.normal(0, 0.15, len(x))noise2 = np.random.normal(0, 0.15, len(x))y1 = np.sin(x) + noise1y2 = np.cos(x) + noise2# 2. 创建画布plt.figure(figsize=(10, 6))# 3. 绘制面积图# alpha较低,营造朦胧感plt.fill_between(x, y1, alpha=0.4, color='#3498db', label='正弦波 + 噪声')plt.fill_between(x, y2, alpha=0.4, color='#2ecc71', label='余弦波 + 噪声')# 可选:画出中心线让趋势更明显plt.plot(x, np.sin(x), color='#2980b9', linewidth=1, linestyle='--', alpha=0.8)plt.plot(x, np.cos(x), color='#27ae60', linewidth=1, linestyle='--', alpha=0.8)# 4. 美化细节plt.xlabel('X 轴 (弧度)', fontsize=12)plt.ylabel('振幅', fontsize=12)plt.title('带噪声的面积图:真实世界的波动', fontsize=16, pad=20)plt.legend(frameon=False, fontsize=12)plt.grid(True, alpha=0.3, linestyle='--')plt.tight_layout()plt.show()
运行效果:
🏗️ 图8:分类柱状图 (Grouped Bar Chart)
特点:三组数据错位排列,数值标签精准呈现,对比强烈。
import matplotlib.pyplot as pltimport numpy as np# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 1. 准备数据categories = ['类别 A', '类别 B', '类别 C', '类别 D']data1 = [5, 20, 15, 25]data2 = [6, 18, 12, 20]data3 = [8, 22, 17, 23]x = np.arange(len(categories)) # 标签位置width = 0.25 # 柱子宽度# 2. 定义配色colors = ['#3498db', '#f39c12', '#2ecc71']# 3. 创建画布plt.figure(figsize=(10, 6))# 4. 绘制三组柱子 (错位排列)bars1 = plt.bar(x - width, data1, width, label='数据集 1', color=colors[0])bars2 = plt.bar(x, data2, width, label='数据集 2', color=colors[1])bars3 = plt.bar(x + width, data3, width, label='数据集 3', color=colors[2])# 5. 添加数值标签 (核心技巧)def add_labels(bars): for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2., height + 0.5, f'{int(height)}', ha='center', va='bottom', fontsize=10, weight='bold')add_labels(bars1)add_labels(bars2)add_labels(bars3)# 6. 美化细节plt.xticks(x, categories, fontsize=12)plt.ylabel('数值', fontsize=12)plt.title('分类柱状图:多维度数据横向对比', fontsize=16, pad=20)plt.legend(frameon=False, loc='upper left')plt.grid(axis='y', alpha=0.3, linestyle='--')plt.axhline(0, color='black', linewidth=0.8)plt.tight_layout()plt.show()
运行效果:
🏗️ 图9:3D地形高程图 | 数据山脉可视化
import plotly.graph_objects as goimport numpy as npfrom scipy import ndimage# 生成地形数据x = np.linspace(-3, 3, 100)y = np.linspace(-3, 3, 100)X, Y = np.meshgrid(x, y)# 创建复杂地形Z1 = np.sin(np.sqrt(X**2 + Y**2))Z2 = 0.3 * np.sin(2*X) * np.cos(2*Y)Z3 = 0.2 * np.exp(-0.5*(X**2 + Y**2))Z = Z1 + Z2 + Z3 + 0.1 * np.random.randn(100, 100)# 平滑处理Z = ndimage.gaussian_filter(Z, sigma=1.5)fig = go.Figure(data=[go.Surface( z=Z, x=X, y=Y, colorscale='Earth', contours={ "z": {"show": True, "usecolormap": True, "highlightcolor": "limegreen", "project": {"z": True}} }, lighting={ "ambient": 0.8, "diffuse": 0.6, "fresnel": 0.2, "specular": 0.5, "roughness": 0.8 }, lightposition={"x": 1000, "y": 1000, "z": 1000}, hoverinfo="skip")])# 添加等高线投影fig.add_trace(go.Contour( z=Z, x=x, y=y, colorscale='Earth', showscale=False, contours=dict(coloring='lines'), line=dict(width=1), hoverinfo="skip"))fig.update_layout( title='🗻 3D数据地形图', scene=dict( xaxis_title='经度', yaxis_title='纬度', zaxis_title='海拔', aspectratio=dict(x=1.5, y=1.5, z=0.8), camera=dict( eye=dict(x=1.8, y=1.8, z=0.8) ) ), autosize=True, height=800, margin=dict(l=0, r=0, b=0, t=50))fig.show()
🏗️ 图10:交互式极坐标雷达图 | 多维度技能评估
import plotly.graph_objects as goimport pandas as pd# 创建技能数据categories = ['Python编程', '数据分析', '机器学习', '可视化', '算法能力', '工程能力', '沟通协作', '产品思维']values = [9, 8, 7, 9, 8, 7, 6, 8]fig = go.Figure()# 添加雷达图fig.add_trace(go.Scatterpolar( r=values + values[:1], # 闭合图形 theta=categories + categories[:1], fill='toself', fillcolor='rgba(0, 255, 170, 0.3)', line=dict(color='#00FFAA', width=3), name='当前技能', hovertemplate='<b>%{theta}</b><br>评分: %{r}/10<extra></extra>'))# 添加目标值对比target_values = [10, 9, 9, 10, 9, 8, 7, 9]fig.add_trace(go.Scatterpolar( r=target_values + target_values[:1], theta=categories + categories[:1], fill='toself', fillcolor='rgba(255, 0, 170, 0.2)', line=dict(color='#FF00AA', width=2, dash='dash'), name='目标技能', hovertemplate='<b>%{theta}</b><br>目标: %{r}/10<extra></extra>'))fig.update_layout( title='🎯 技能雷达图 | 个人能力评估', polar=dict( radialaxis=dict( visible=True, range=[0, 10], tickfont=dict(size=12), gridcolor='rgba(255,255,255,0.3)', linecolor='rgba(255,255,255,0.5)' ), angularaxis=dict( tickfont=dict(size=13, color='white'), gridcolor='rgba(255,255,255,0.2)', linecolor='rgba(255,255,255,0.5)', rotation=90 ), bgcolor='rgba(20, 20, 40, 0.8)' ), showlegend=True, legend=dict( yanchor="top", y=0.99, xanchor="left", x=0.01, bgcolor='rgba(0,0,0,0.5)', bordercolor='rgba(255,255,255,0.3)', borderwidth=1 ), paper_bgcolor='rgba(10, 10, 30, 1)', font_color='white', height=700)fig.show()
💡 结语
好的可视化不是炫技,而是让数据自己说话。这10段代码涵盖了散点、3D、面积、热力、箱线、折线、柱状等最常用的图表类型。
👉 建议操作:
- 尝试修改
colors(颜色)、alpha(透明度)或 data(数据),看看图表会发生什么有趣的变化!