python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python折线图

Python中可视化折线图的四种创意方法

作者:databook

这篇文章主要为大家详细介绍了Python中四种特别的折线图变体,它们各有所长,能让你的数据故事更加生动,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

想象一下折线图就像一条普通的公路,它能带我们从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()

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

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()

凹凸图在这种场景下的优势在于 排名的更替

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()

周期图在这种场景下的优势在于 季节性模式的识别

5. 总结

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

实际情况下,选择哪种变体取决于你的数据特点和想要传达的信息。

关键是要记住:可视化不是为了炫技,而是为了更好地讲述数据故事。下次当我们面对数据时,不妨思考一下,哪种"变形"的折线图能让你的故事更加动人。

到此这篇关于Python中可视化折线图的四种创意方法的文章就介绍到这了,更多相关Python折线图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文