python 棒棒糖图

结果:

复制代码
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np


def lolly_plot(x, y, color_lis, breaks, back_color,
               title, sub_title):
    # 获取每个点的颜色
    colors = [assign_color(temperature, breaks, color_lis) for temperature in temperature_changes]

    # 创建图形
    fig, ax = plt.subplots(figsize=(10, 12))

    # 绘制棒棒糖
    ax.vlines(x=x, ymin=0, ymax=y, color=colors, alpha=0.8, linewidth=2)  # 竖线
    ax.scatter(x, y, color=colors, s=50, zorder=3)  # 点

    # 添加水平线(0℃、-0.4℃、0.8℃)
    ax.axhline(0.8, color=color_lis[-1], linewidth=1, alpha=0.5)
    ax.axhline(0.4, color=color_lis[4], linewidth=1, alpha=0.5)
    ax.axhline(0, color='black', linewidth=1)
    ax.axhline(-0.4, color=color_lis[0], linewidth=1, alpha=0.5)

    # 设置坐标轴
    ax.set_xlim(1880, 2020)
    ax.set_ylim(-0.5, 1.0)
    ax.set_xticks(np.arange(1880, 2021, 20))
    ax.set_yticks([-0.4, 0, 0.4, 0.8])
    # 去掉顶部和右侧的边框线
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)

    # 设置标签
    ax.set_title(title, fontsize=20, weight='bold', ha='left', x=0.02)
    ax.text(0.02, 0.99, sub_title, transform=ax.transAxes, fontsize=12, va='top', color='gray')

    # 设置背景颜色
    fig.patch.set_color(back_color)
    ax.patch.set_color(back_color)

    # 显示图像
    plt.tight_layout()  # 让图表更贴近边框
    plt.show()


# 分段赋色规则(对应原图的分块颜色)
def assign_color(value, breaks, colors):
    """
    分段赋色。小于等于第一个断点为第一个区间,大于第一个断点、小于等于第二个断点为第二个区间...,大于最后一个断点为最后一个区间。
    breaks:断点。 breaks至少比colors少一个。
    colors:颜色。从数值最低的颜色到数值最高的颜色,依次排列。
    """
    # 从小到大,依次排列断点。
    breaks = list(breaks)
    breaks.sort(reverse=False)  # 升序排列
    # bisect_left: 二分法查找某个值所在的区间。(若为边界值,则落入左侧区间。)
    index = bisect_left(breaks, value)
    return colors[index]


if __name__ == '__main__':
    # 年份数据
    years = np.arange(1880, 2021)

    # 模拟温度变化数据,接近实际趋势
    temperature_changes = np.zeros(len(years))
    # 分段设定温度变化趋势,并加入波动
    np.random.seed(0)
    temperature_changes[0:60] = np.linspace(-.5, -.2, 60) + np.random.normal(0, .05, 60)  # 1880-1940 年
    temperature_changes[60:100] = np.linspace(-.2, .1, 40) + np.random.normal(0, .03, 40)  # 1940-1980 年
    temperature_changes[100:] = np.linspace(.1, .9, len(years) - 100) + np.random.normal(0, .02, len(years) - 100)

    # 为每个温度区间分配颜色
    color_lis = ['#212B4E', '#0571B6', '#17B3BA', '#FDBE85', '#D94701', '#871A03']
    breaks = [-0.25, -0.1, 0, 0.3, 0.52]
    back_color = '#FEFAEF'

    # 设置标题
    title = "Global Land-Ocean Temperature Index"
    text = "Change in global surface temperature compared to the long-term average\nfrom 1951 to 1980"

    lolly_plot(years, temperature_changes, color_lis, breaks, back_color, title, text)
相关推荐
Hgfdsaqwr6 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
开发者小天6 小时前
python中For Loop的用法
java·服务器·python
老百姓懂点AI7 小时前
[RAG实战] 向量数据库选型与优化:智能体来了(西南总部)AI agent指挥官的长短期记忆架构设计
python
喵手9 小时前
Python爬虫零基础入门【第九章:实战项目教学·第15节】搜索页采集:关键词队列 + 结果去重 + 反爬友好策略!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·搜索页采集·关键词队列
Suchadar9 小时前
if判断语句——Python
开发语言·python
ʚB҉L҉A҉C҉K҉.҉基҉德҉^҉大9 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
喵手9 小时前
Python爬虫零基础入门【第九章:实战项目教学·第14节】表格型页面采集:多列、多行、跨页(通用表格解析)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·表格型页面采集·通用表格解析
0思必得010 小时前
[Web自动化] 爬虫之API请求
前端·爬虫·python·selenium·自动化
莫问前路漫漫10 小时前
WinMerge v2.16.41 中文绿色版深度解析:文件对比与合并的全能工具
java·开发语言·python·jdk·ai编程
木头左10 小时前
Backtrader框架下的指数期权备兑策略资金管理实现与风险控制
python