折线图的奥妙变奏:四种创意可视化方法 [复制链接]
发表于 2026-1-24 17:44:18 | 显示全部楼层 |阅读模式
想象一下折线图就像一条寻常的公路,它能带我们从A点到达B点。
但偶尔我们须要更特殊的门路:环岛盘山公路波浪形赛道螺旋上升的通道。
在数据可视化中,标准的折线图偶尔无法充实展示数据的特性,这时我们就须要一些创意变种。
本日将先容四种特殊的折线图变体,它们各有所长,能让你的数据故事更加生动。
1. 圆形折线图:时间的循环

如果把寻常的折线图首尾相连,放在圆形坐标系中,就得到了圆形折线图。
它特殊恰当展示周期性数据,好比一天24小时的温度变革、一周七天的贩卖数据,大概一年四序的气候模式。
它的实现原理是:使用极坐标体系,将角度代表时间或种别,半径代表数值巨细。
在matplotlib中,只须要创建一个极坐标子图,然后像寻常折线图一样绘制即可。
  1. # 圆形折线图
  2. # 数据准备
  3. hours = np.linspace(0, 2 * np.pi, 24, endpoint=False)
  4. values = [] # ....
  5. # 闭合数据
  6. values_cycle = np.concatenate((values, [values[0]]))
  7. hours_cycle = np.concatenate((hours, [hours[0]]))
  8. hour_labels = [f"{h}点" for h in range(24)]
  9. fig = plt.figure(figsize=(14, 6))
  10. # --- 左图:普通折线图 ---
  11. ax1 = fig.add_subplot(121)
  12. ax1.plot(range(24), values, marker="o", color="#FF6B6B")
  13. # 省略...
  14. # --- 右图:圆形折线图 ---
  15. ax2 = fig.add_subplot(122, projection="polar")
  16. ax2.plot(hours_cycle, values_cycle, linewidth=2, color="#FF6B6B")
  17. # 省略...
  18. plt.show()
复制代码

圆形折线图在这种场景下的上风在于 周期性的闭环感

  • 左图(寻常): 像把这一天的时间堵截了,23:00 和 00:00 分隔在两端,看不出它们着实紧挨着。
  • 右图(圆形): 美满闭合。你能直观地感受到“深夜”是一个连续的时间段。
2. 斜率图:变革的快照

想象一下比力两个人从出发点到尽头的跑步速率。
斜率图就像两张快照:一张在出发点,一张在尽头,中心用直线毗连。
线的斜率代表了变革的速率,陡峭的上坡体现大幅增长,平缓的线体现变革不大,下坡则体现降落。
它的实现原理:通常在两侧体现两个时间点或两种状态的数据,然后用直线毗连对应的数据点。
线的斜率直观展示了变革的巨细和方向
  1. # 斜率图
  2. # 数据
  3. depts = ['销售部', '人事部', '技术部', '研发部', '市场部']
  4. score_before = [65, 70, 88, 85, 60]
  5. score_after = [85, 68, 92, 80, 90]
  6. fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
  7. # --- 左图:普通折线图 ---
  8. x = [1, 2] # 代表前后两个时间点
  9. for i in range(len(depts)):
  10.     ax1.plot(x, [score_before[i], score_after[i]], marker='o', label=depts[i])
  11. # 省略 ...
  12. # --- 右图:斜率图 ---
  13. for i in range(len(depts)):
  14.     color = 'green' if score_after[i] > score_before[i] else 'red'
  15.     # 绘制线条
  16.     ax2.plot([0, 1], [score_before[i], score_after[i]], color=color, marker='o', linewidth=2)
  17.     # 直接在点旁边标注文字,去除图例查找的负担
  18.     ax2.text(-0.05, score_before[i], f"{depts[i]} {score_before[i]}", ha='right', va='center')
  19.     ax2.text(1.05, score_after[i], f"{score_after[i]}", ha='left', va='center')
  20. # 省略 ...
  21. plt.tight_layout()
  22. plt.show()
复制代码

斜率图在这种场景下的上风在于 极简的变革趋势

  • 左图(寻常): 固然也能看,但在坐标轴的干扰下,你须要盯着读数看。
  • 右图(斜率): 去掉了多余的刻度线,只生存首尾。线条越陡峭,代表变革越剧烈。这就像是从“阅读分析书”变成了“看红绿灯”,一清二楚。
3. 凹凸图:排名的舞蹈

想象一下竞走中的名次变革:起跑时A领先,中途B反超,末了C冲刺夺冠。
凹凸图就像记录这场角逐的名次变革表,每个时间点谁在前谁在后一清二楚。
它的实现原理:通常展示多个项目在差异时间点的排名变革。
每个项目有一条线,线的上下位置代表排名高低。由于排名是相对的,以是这些线总会交织,形成风趣的波浪形。
  1. # 凹凸图
  2. years = [2019, 2020, 2021, 2022, 2023]
  3. # 排名数据
  4. ranks = {
  5.     '品牌A': [1, 1, 2, 3, 4],
  6.     '品牌B': [4, 3, 1, 1, 2],
  7.     '品牌C': [2, 4, 3, 2, 1],
  8.     '品牌D': [3, 2, 4, 4, 3]
  9. }
  10. colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']
  11. fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
  12. # --- 左图:普通折线图 (模拟数值非常接近的情况) ---
  13. # 假设排名对应的数值很接近,很难看清
  14. values_simulated = {
  15.     '品牌A': [30, 31, 25, 20, 15],
  16.     '品牌B': [10, 15, 30, 32, 28],
  17.     '品牌C': [25, 12, 22, 28, 35],
  18.     '品牌D': [20, 22, 18, 15, 20]
  19. }
  20. for brand, val_list in values_simulated.items():
  21.     ax1.plot(years, val_list, marker='o', label=brand)
  22. # 省略 ...
  23. # --- 右图:凹凸图 ---
  24. for idx, (brand, rank_list) in enumerate(ranks.items()):
  25.     ax2.plot(years, rank_list, marker='o', markersize=15, linewidth=4, label=brand, color=colors[idx])
  26.     # 在圆点中写上名次
  27.     for x, y in zip(years, rank_list):
  28.         ax2.text(x, y, str(y), color='white', ha='center', va='center', fontweight='bold')
  29. ax2.invert_yaxis() # 关键:倒转Y轴,让第1名在最上面
  30. # 省略 ...
  31. plt.tight_layout()
  32. plt.show()
复制代码

凹凸图在这种场景下的上风在于 排名的更替

  • 左图(寻常): 我们通常画的是“数值”。如果四个品牌的市场份额很靠近(好比20%和21%),线条会粘连在一起,很丢脸清谁第一谁第二。
  • 右图(凹凸): Y轴不再是数值,而是“名次”。这里将排名匀称拉开,你可以清晰地看到品牌C是怎样像黑马一样从末了一名杀到第一名的。
4. 周期图:模式的放大镜

想象一下观察一年的温度变革。
寻常折线图会体现一条有365个点的波浪线,周期图则把这365天禀成12个月,把每个月的31天叠加在一起比力,就像把一年的温度曲线切成12段,然后并排放在一起。
它的实现原理:将时间序列数据按照周期(天、周、月、年等)切分,然后将每个周期重叠绘制。
如许可以直观比力差异周期内的模式是否相似,以及每个周期相对于团体的体现。
  1. # 周期图
  2. months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
  3. # 模拟长数据
  4. sales_2021 = [20, 25, 35, 50, 80, 100, 110, 105, 70, 50, 30, 25]
  5. sales_2022 = [22, 28, 40, 55, 85, 105, 115, 100, 75, 55, 35, 28]
  6. sales_2023 = [25, 30, 45, 60, 95, 120, 130, 115, 80, 60, 40, 35]
  7. fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
  8. # --- 左图:普通折线图 (线性时间轴) ---
  9. # 把所有数据拼成一条长线
  10. all_sales = sales_2021 + sales_2022 + sales_2023
  11. all_months_idx = range(len(all_sales))
  12. ax1.plot(all_months_idx, all_sales, color='#3498db', linewidth=2)
  13. # 省略 ...
  14. # --- 右图:周期图 (叠加时间轴) ---
  15. ax2.plot(months, sales_2021, marker='.', label='2021年', color='lightgrey', linewidth=2, linestyle='--')
  16. ax2.plot(months, sales_2022, marker='.', label='2022年', color='grey', linewidth=2, linestyle='--')
  17. ax2.plot(months, sales_2023, marker='o', label='2023年', color='#3498db', linewidth=3)
  18. # 省略 ...
  19. plt.tight_layout()
  20. plt.show()
复制代码

周期图在这种场景下的上风在于 季候性模式的辨认

  • 左图(寻常): 一条长线绵延不停。想要对比2021年7月和2023年7月的数据,眼睛须要在图表左右两端往返横跳,非常累。
  • 右图(周期): 就像把每年的数据“叠”在了一起。你可以直接看到,无论哪一年,7月都是最高峰,而12月都是低谷。规律一清二楚。
5. 总结

每种折线图变体都有其独特的代价:

  • 圆形折线图:恰当展示周期性数据,首尾相接的计划夸大循环
  • 斜率图:恰当比力两个时间点的变革,直观展示变革幅度
  • 凹凸图:恰当展示排名或相对位置的变革,竞争关系一清二楚
  • 周期图:恰当比力多个周期的模式,发现季候性规律
实际环境下,选择哪种变体取决于你的数据特点和想要转达的信息。
关键是要记取:可视化不是为了炫技,而是为了更好地陈诉数据故事。下次当我们面对数据时,不妨思考一下,哪种"变形"的折线图能让你的故事更加动人。
完备的代码共享在:折线图的4个变种.ipynb (访问暗码: 6872)

免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表