想象一下折线图就像一条寻常的公路,它能带我们从A点到达B点。
但偶尔我们须要更特殊的门路:环岛、盘山公路、波浪形赛道或螺旋上升的通道。
在数据可视化中,标准的折线图偶尔无法充实展示数据的特性,这时我们就须要一些创意变种。
本日将先容四种特殊的折线图变体,它们各有所长,能让你的数据故事更加生动。
1. 圆形折线图:时间的循环
如果把寻常的折线图首尾相连,放在圆形坐标系中,就得到了圆形折线图。
它特殊恰当展示周期性数据,好比一天24小时的温度变革、一周七天的贩卖数据,大概一年四序的气候模式。
它的实现原理是:使用极坐标体系,将角度代表时间或种别,半径代表数值巨细。
在matplotlib中,只须要创建一个极坐标子图,然后像寻常折线图一样绘制即可。- # 圆形折线图
- # 数据准备
- hours = np.linspace(0, 2 * np.pi, 24, endpoint=False)
- values = [] # ....
- # 闭合数据
- values_cycle = np.concatenate((values, [values[0]]))
- hours_cycle = np.concatenate((hours, [hours[0]]))
- hour_labels = [f"{h}点" for h in range(24)]
- fig = plt.figure(figsize=(14, 6))
- # --- 左图:普通折线图 ---
- ax1 = fig.add_subplot(121)
- ax1.plot(range(24), values, marker="o", color="#FF6B6B")
- # 省略...
- # --- 右图:圆形折线图 ---
- ax2 = fig.add_subplot(122, projection="polar")
- ax2.plot(hours_cycle, values_cycle, linewidth=2, color="#FF6B6B")
- # 省略...
- plt.show()
复制代码
圆形折线图在这种场景下的上风在于 周期性的闭环感。
- 左图(寻常): 像把这一天的时间堵截了,23:00 和 00:00 分隔在两端,看不出它们着实紧挨着。
- 右图(圆形): 美满闭合。你能直观地感受到“深夜”是一个连续的时间段。
2. 斜率图:变革的快照
想象一下比力两个人从出发点到尽头的跑步速率。
斜率图就像两张快照:一张在出发点,一张在尽头,中心用直线毗连。
线的斜率代表了变革的速率,陡峭的上坡体现大幅增长,平缓的线体现变革不大,下坡则体现降落。
它的实现原理:通常在两侧体现两个时间点或两种状态的数据,然后用直线毗连对应的数据点。
线的斜率直观展示了变革的巨细和方向。- # 斜率图
- # 数据
- depts = ['销售部', '人事部', '技术部', '研发部', '市场部']
- score_before = [65, 70, 88, 85, 60]
- score_after = [85, 68, 92, 80, 90]
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
- # --- 左图:普通折线图 ---
- x = [1, 2] # 代表前后两个时间点
- for i in range(len(depts)):
- ax1.plot(x, [score_before[i], score_after[i]], marker='o', label=depts[i])
- # 省略 ...
- # --- 右图:斜率图 ---
- for i in range(len(depts)):
- color = 'green' if score_after[i] > score_before[i] else 'red'
- # 绘制线条
- ax2.plot([0, 1], [score_before[i], score_after[i]], color=color, marker='o', linewidth=2)
- # 直接在点旁边标注文字,去除图例查找的负担
- ax2.text(-0.05, score_before[i], f"{depts[i]} {score_before[i]}", ha='right', va='center')
- ax2.text(1.05, score_after[i], f"{score_after[i]}", ha='left', va='center')
- # 省略 ...
- plt.tight_layout()
- plt.show()
复制代码
斜率图在这种场景下的上风在于 极简的变革趋势。
- 左图(寻常): 固然也能看,但在坐标轴的干扰下,你须要盯着读数看。
- 右图(斜率): 去掉了多余的刻度线,只生存首尾。线条越陡峭,代表变革越剧烈。这就像是从“阅读分析书”变成了“看红绿灯”,一清二楚。
3. 凹凸图:排名的舞蹈
想象一下竞走中的名次变革:起跑时A领先,中途B反超,末了C冲刺夺冠。
凹凸图就像记录这场角逐的名次变革表,每个时间点谁在前谁在后一清二楚。
它的实现原理:通常展示多个项目在差异时间点的排名变革。
每个项目有一条线,线的上下位置代表排名高低。由于排名是相对的,以是这些线总会交织,形成风趣的波浪形。- # 凹凸图
- years = [2019, 2020, 2021, 2022, 2023]
- # 排名数据
- ranks = {
- '品牌A': [1, 1, 2, 3, 4],
- '品牌B': [4, 3, 1, 1, 2],
- '品牌C': [2, 4, 3, 2, 1],
- '品牌D': [3, 2, 4, 4, 3]
- }
- colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
- # --- 左图:普通折线图 (模拟数值非常接近的情况) ---
- # 假设排名对应的数值很接近,很难看清
- values_simulated = {
- '品牌A': [30, 31, 25, 20, 15],
- '品牌B': [10, 15, 30, 32, 28],
- '品牌C': [25, 12, 22, 28, 35],
- '品牌D': [20, 22, 18, 15, 20]
- }
- for brand, val_list in values_simulated.items():
- ax1.plot(years, val_list, marker='o', label=brand)
- # 省略 ...
- # --- 右图:凹凸图 ---
- for idx, (brand, rank_list) in enumerate(ranks.items()):
- ax2.plot(years, rank_list, marker='o', markersize=15, linewidth=4, label=brand, color=colors[idx])
- # 在圆点中写上名次
- for x, y in zip(years, rank_list):
- ax2.text(x, y, str(y), color='white', ha='center', va='center', fontweight='bold')
- ax2.invert_yaxis() # 关键:倒转Y轴,让第1名在最上面
- # 省略 ...
- plt.tight_layout()
- plt.show()
复制代码
凹凸图在这种场景下的上风在于 排名的更替。
- 左图(寻常): 我们通常画的是“数值”。如果四个品牌的市场份额很靠近(好比20%和21%),线条会粘连在一起,很丢脸清谁第一谁第二。
- 右图(凹凸): Y轴不再是数值,而是“名次”。这里将排名匀称拉开,你可以清晰地看到品牌C是怎样像黑马一样从末了一名杀到第一名的。
4. 周期图:模式的放大镜
想象一下观察一年的温度变革。
寻常折线图会体现一条有365个点的波浪线,周期图则把这365天禀成12个月,把每个月的31天叠加在一起比力,就像把一年的温度曲线切成12段,然后并排放在一起。
它的实现原理:将时间序列数据按照周期(天、周、月、年等)切分,然后将每个周期重叠绘制。
如许可以直观比力差异周期内的模式是否相似,以及每个周期相对于团体的体现。- # 周期图
- months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
- # 模拟长数据
- sales_2021 = [20, 25, 35, 50, 80, 100, 110, 105, 70, 50, 30, 25]
- sales_2022 = [22, 28, 40, 55, 85, 105, 115, 100, 75, 55, 35, 28]
- sales_2023 = [25, 30, 45, 60, 95, 120, 130, 115, 80, 60, 40, 35]
- fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
- # --- 左图:普通折线图 (线性时间轴) ---
- # 把所有数据拼成一条长线
- all_sales = sales_2021 + sales_2022 + sales_2023
- all_months_idx = range(len(all_sales))
- ax1.plot(all_months_idx, all_sales, color='#3498db', linewidth=2)
- # 省略 ...
- # --- 右图:周期图 (叠加时间轴) ---
- ax2.plot(months, sales_2021, marker='.', label='2021年', color='lightgrey', linewidth=2, linestyle='--')
- ax2.plot(months, sales_2022, marker='.', label='2022年', color='grey', linewidth=2, linestyle='--')
- ax2.plot(months, sales_2023, marker='o', label='2023年', color='#3498db', linewidth=3)
- # 省略 ...
- plt.tight_layout()
- plt.show()
复制代码
周期图在这种场景下的上风在于 季候性模式的辨认。
- 左图(寻常): 一条长线绵延不停。想要对比2021年7月和2023年7月的数据,眼睛须要在图表左右两端往返横跳,非常累。
- 右图(周期): 就像把每年的数据“叠”在了一起。你可以直接看到,无论哪一年,7月都是最高峰,而12月都是低谷。规律一清二楚。
5. 总结
每种折线图变体都有其独特的代价:
- 圆形折线图:恰当展示周期性数据,首尾相接的计划夸大循环
- 斜率图:恰当比力两个时间点的变革,直观展示变革幅度
- 凹凸图:恰当展示排名或相对位置的变革,竞争关系一清二楚
- 周期图:恰当比力多个周期的模式,发现季候性规律
实际环境下,选择哪种变体取决于你的数据特点和想要转达的信息。
关键是要记取:可视化不是为了炫技,而是为了更好地陈诉数据故事。下次当我们面对数据时,不妨思考一下,哪种"变形"的折线图能让你的故事更加动人。
完备的代码共享在:折线图的4个变种.ipynb (访问暗码: 6872)
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |