小北使用Python和pyecharts对我校通信学院2024大数据专业就业情况进行中国地图可视化

news2024/11/15 20:56:58

 

引言

       8bc5b77b1f25404481305dae771fc997.gif在数据分析领域,地图可视化是一种直观展示数据分布和趋势的有效方式。然而,当我们面对如“2020-2024届近5年通信就业数据”这样的数据集时,挑战也随之而来。这些数据通常包含就业单位名称和对应的学生信息,但缺乏直接的地理位置信息(如省份、城市)。本文将介绍如何使用Python和pyecharts库,通过间接方式(统计各省份的就业人数)来实现中国地图上的数据可视化。ccac1713fdb3492d9e73bb8cb6dbd361.pngbf02d2bc508b440eb9f7d35da376ad55.gif

 

pyecharts - A Python Echarts Plotting Library built with love.Descriptionhttps://pyecharts.org/#/

5 分钟完全解读 pyecharts 动态图表8265fca3de894c6aa1bfac41ba570a2a.png

1. pyecharts简介

pyecharts是基于百度开源图表组件echarts的python封装。支持所有常用的图表组件,和matlibplot系的图表库不同的是:pyecharts支持动态交互展示,这一点在查看复杂数据图表时特别的有用。

pip install pyecharts

2.pyecharts简单使用

pyecharts支持常用的基本图形展示,条形图、折线图、饼图、散点图、热力图、漏斗图、雷达图、箱型图、地图等,还能支持仪表盘,树形图的展示。

from pyecharts.charts import Bar,Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType

line = (
    Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT, width='1000px',height='300px' ))
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
    .add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
    .set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"),
                        datazoom_opts=opts.DataZoomOpts(is_show=True))
    .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
)
line.render('test.html')
line.render_notebook()

 

 

cfe189dfec429dfe9cd7d1c4dd0ddbfe.png

从上面简单事例可知,pyecharts的使用包括:

  • 图标类型(Line)本身的初始化配置,如主题,大小

  • 加载数据:如加载x轴数据,加载y轴数据(可以多个)

  • 设置全局配置,如标题,区域缩放datazoom,工具箱等

  • 设置系列配置项,如标签,线条,刻度文本展示等

  • 图标显示:render保存成html文件,如果是jupyter notebook则直接通过render_notebook展示在notebook中

3.常用配置使用

在pyecharts中,关于图表外观显示等操作都是在相应的option里配置,包括坐标轴,图例,数据标签,网格线,图表样式/颜色,不同系列等等。

 

b69cd922892abdd29a225b73909db2b6.png

  • InitOpts:各个图表类型初始配置

  • set_global_opts:全局外观配置

  • set_series_opts:系列配置

为了方便大家和自己,下面给出一个常用的组合,通常可视化足够用了,快收藏。

  • InitOpts:主题,长宽,动画效果

  • DataZoomOpts:区域收缩,这个对于数据特别多,如一天的时间序列数据,特别有用,可以拖动查看全局和局部的数据(可以设置是否显式显式还是可拖动type_="inside")

  • 标题配置TitleOpts:说明这个图表说明的是什么,必备的吧

  • 图例配置LegendOpts:说明图表中的不同数据项(这个图例是可以点击的,可以单独查看某个图例的数据,很有用)

  • 提示框配置TooltipOpts:显示图例具体某个点的数据

  • x轴和y轴坐标轴标题说明AxisOpts

  • 坐标刻度调整:特别适用于刻度说明比较多,可以显示角度变换等

  • markpoint/markline: 对图表的特别标记,用于重点说明部分和标注区分线

from pyecharts.charts import Bar,Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType

bar = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT, 
                                 width='1000px',
                                 height='300px', 
                                 animation_opts=opts.AnimationOpts(animation_delay=1000, animation_easing="elasticOut")
                                )
        )
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
    .add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
    .set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"),
                     toolbox_opts=opts.ToolboxOpts(is_show=False),
                     # datazoom_opts=opts.DataZoomOpts(is_show=True)
                     datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
                     legend_opts=opts.LegendOpts(type_="scroll", pos_left="50%", orient="vertical"),
                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15), name="我是 X 轴"),
                     yaxis_opts=opts.AxisOpts(name="我是 Y 轴", axislabel_opts=opts.LabelOpts(formatter="{value} /月")),
                     tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),

                    )
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                    markpoint_opts=opts.MarkPointOpts(
                        data=[
                            opts.MarkPointItem(type_="max", name="最大值"),
                            opts.MarkPointItem(type_="min", name="最小值"),
                            opts.MarkPointItem(type_="average", name="平均值"),
                        ]
                        ),
                    )
)
# line.render('test.html')
bar.render_notebook()

 

 

ea9194824fbe9235526d5f50b23fca8a.png

4.常用组合图表使用

常用组合图表有:

  • 不同图表类型组合如柱状图和折线图组合在一张图中(双y轴),主要的看同一视角不同指标的差异和关联;pyecharts中是通过overlap实现

    from pyecharts import options as opts
    from pyecharts.charts import Bar, Line
    from pyecharts.faker import Faker
    
    v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
    v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]
    v3 = [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
    
    
    bar = (
        Bar(init_opts=opts.InitOpts(width="680px", height="300px"))
        .add_xaxis(Faker.months)
        .add_yaxis("蒸发量", v1)
        .add_yaxis("降水量", v2)
        .extend_axis(
            yaxis=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value} °C"), interval=5
            )
        )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Overlap-bar+line"),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} ml")),
            tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
        )
    )
    
    line = Line().add_xaxis(Faker.months).add_yaxis("平均温度", v3, yaxis_index=1)
    bar.overlap(line)
    bar.render_notebook()
    

    从实现上,

    • .extend_axis增加一个纵坐标

    • 增加的折线图设置轴坐标时设置yaxis_index索引和前面的纵坐标对应

    • 然后两张叠加overlap bar.overlap(line)

 

 

20fc539806a8edf68d7db5893a982dd9.png

  • 多图标以网格(GRID)方式组合,主要是对比;pyecharts中是通过grid组件实现

    from pyecharts import options as opts
    from pyecharts.charts import Bar, Grid, Line
    from pyecharts.faker import Faker
    
    bar = (
        Bar()
        .add_xaxis(Faker.choose())
        .add_yaxis("商家A", Faker.values())
        .add_yaxis("商家B", Faker.values())
        .set_global_opts(title_opts=opts.TitleOpts(title="Grid-Bar"))
    )
    line = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis("商家A", Faker.values())
        .add_yaxis("商家B", Faker.values())
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Grid-Line", pos_top="48%"),
            legend_opts=opts.LegendOpts(pos_top="48%"),
        )
    )
    
    grid = (
        Grid(init_opts=opts.InitOpts(width="680px", height="500px"))
        .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
        .add(line, grid_opts=opts.GridOpts(pos_top="60%"))
    )
    grid.render_notebook()
    

    从实现看

    • 主要通过Grid把各种图形放入其中

    • 各个图表的位置通过GridOpts来设置,上下左右的位置

    • 需要注意的是:grid中图表的title和图例需要根据所处位置来指定相对的位置(这个有点麻烦,多调调)

 

 

589a4e1d5ed8dd991cba5f56685df54d.png

5.地图使用

地图可用在展示数据在地理位置上的分布情况,也是很常见的可视化的展示组件。pyecharts中是通过Map类来实现的。具体细节需要注意:

  • map支持不同的maptype,如中国地图china(省级) china-cities(市级),世界地图world,还有中国各省市地图以及世界各国国家地图,参看github pyecharts/datasets/map_filename.json

  • map的数据格式是(地理位置, value), 如[['广东', 76],['北京', 58]]

  • 可以通过visualmap_opts查看着重点

from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker

c1 = (
    Map()
    .add("商家A", [list(z) for z in zip(Faker.guangdong_city, Faker.values())], "广东")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-广东地图"), visualmap_opts=opts.VisualMapOpts()
    )
   
)

c2 = (
    Map()
    .add("商家A", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Map-VisualMap(连续型)"),
        visualmap_opts=opts.VisualMapOpts(max_=200),
    )
)

# c1.render_notebook()
c2.render_notebook()

 

 

4e1fed1532aadc8e920f1525d31f03f2.png

6.特色图表使用

在学习pyecharts时,看到一些比较有意思的(动态展示)组件,如随着时间动态展示图表数据的变化。这里做下介绍

  • Timeline:时间线轮播多图 先声明一个Timeline, 按照展示的时间顺序,将图表add到Timeline上; 可以通过播放按钮循环按照时间顺序展示图表。

    from pyecharts import options as opts
    from pyecharts.charts import Pie, Timeline
    from pyecharts.faker import Faker
    
    attr = Faker.choose()
    tl = Timeline()
    for i in range(2015, 2020):
        pie = (
            Pie()
            .add(
                "商家A",
                [list(z) for z in zip(attr, Faker.values())],
                rosetype="radius",
                radius=["30%", "55%"],
            )
            .set_global_opts(title_opts=opts.TitleOpts("某商店{}年营业额".format(i)))
        )
        tl.add(pie, "{}年".format(i))
    tl.render_notebook()
    

 

 

ce3bb15905029073104757e6a5efa86b.png

  • 仪表盘

    from pyecharts import options as opts
    from pyecharts.charts import Gauge
    
    c = (
        Gauge()
        .add("", [("完成率", 30.6)], radius="70%",
            axisline_opts=opts.AxisLineOpts(
                linestyle_opts=opts.LineStyleOpts(
                    color=[(0.3, "#67e0e3"), (0.7, "#37a2da"), (1, "#fd666d")], width=30)
                ),
                title_label_opts=opts.LabelOpts(
                    font_size=20, color="blue", font_family="Microsoft YaHei"
                ),
            )
        .set_global_opts(title_opts=opts.TitleOpts(title="Gauge-基本示例"), legend_opts=opts.LegendOpts(is_show=False),)
    
    )
    c.render_notebook()
    

 

 

72ff4279ceece52713ae0866c8a1d712.png

7.其他图表一览

从上面的实例看,已经展示地图,条形图,折线图,饼图,仪表盘。这里展示下pyecharts提供的更多的图表,

  • 雷达图 Radar

 

 

aec2195960a165672f7953f054504a7a.png

  • 树形图 Tree

 

 

7c33b654c711248d8364efc148e2ef35.png

 

  • 热力图 heatMap

 

 

a8e90085bc219a97d965b7ce491d910b.png

  • 日历图 Calendar

 

 

97b34f239602940698fed6d4448f971f.png

  • 散点图 Scatter

 

 

bffbd5f3f1ad9f8b599a026e1ada2f74.png

  • 3D图 Bar3D

 

 

77e82106ae61ca09cef16e574dee5b91.png

  • 箱型图 Boxplot

 

 

1e62d260a2582ebc90f89b0847f39d44.png

8.总结

本文介绍的基于echarts的python动态图表展示组件pyecharts,除了提供众多常用的图表外,最重要的是支持动态操作数据。总结如下:

  • pyecharts所有的图像属性设置都通过opts来设置,有图表初始属性/全局属性/系列属性

  • 本文提供常用的配置,足够用了,拿走不谢,见常用配置使用

  • pyecharts 支持多图表组合,如折线图和条形图 overlap, 多个图表grid展示

  • pyecharts好用的map,可以展示中国省市,世界各国地图,请按照[位置,value]准备数据

  • Timeline可以让你的图表按照时间轮播

  • 更多图表参见参考资料

9.参考资料

  • pyecharts - A Python Echarts Plotting Library built with love.Descriptionhttps://pyecharts.org/#/zh-cn/quickstart

97185280f8f943a8b82f134e18824a7d.gif1200f066c18d48fcb047229efeab52d0.gif

案例展示:

一、数据预处理

步骤 1: 获取和清洗数据

      首先,小北需要从“2020-2024届近5年通信就业数据 - 副本 - 副本.xlsx”文件中读取数据。由于数据集中不包含直接的地理位置信息,你需要手动或通过外部API获取每个就业单位的省份信息。

import pandas as pd  
  
# 读取Excel文件  
df = pd.read_excel('2020-2024届近5年通信就业数据 - 副本 - 副本.xlsx')  
  
# 假设你已经有了一个包含单位名称和对应省份的映射(这里只是示例)  
# 或者你可以通过某种方式(如网络搜索、数据库查询等)来填充这个映射  
unit_to_province = {  
    '单位A': '上海',  
    '单位B': '北京',  
    # ... 其他单位  
}  
  
# 将单位名称映射到省份,并统计每个省份的就业人数  
province_jobs = df['单位名称'].map(unit_to_province).value_counts().to_dict()
注意事项
  • 数据获取:确保你有权访问并处理这些数据。
  • 准确性:单位到省份的映射需要尽可能准确,这可能需要大量的手动工作或使用外部数据源。
  • 数据处理:使用Pandas等库可以大大简化数据清洗和统计过程。

二、使用pyecharts进行可视化

步骤 2: 安装和导入pyecharts

如果你还没有安装pyecharts,可以通过pip进行安装:

pip install pyecharts
然后,在Python脚本中导入必要的模块:
from pyecharts.charts import Map 
from pyecharts import options as opts

 

步骤 3: 创建地图并添加数据

使用pyecharts的Map类来创建地图,并添加省份和对应的就业人数数据。

# 创建地图 
m = Map() 
m.add("通信专业学生就业人数", [list(z) for z in zip(province_jobs.keys(), province_jobs.values())], "china") 
m.set_global_opts( 
title_opts=opts.TitleOpts(title="通信专业学生就业地域分布"), 
visualmap_opts=opts.VisualMapOpts(max_=max(province_jobs.values()), is_piecewise=True), # 调整为实际最大值 
) 


# 渲染图表到HTML文件 
m.render('communication_job_map.html')

 

注意事项

  • 最大值设置:在VisualMapOpts中,max_应设置为就业人数的最大值,以确保视觉映射的准确性。
  • 分段显示is_piecewise=True表示视觉映射将分段显示,这有助于区分不同数量级的就业人数。
  • 图表展示:生成的HTML文件可以在浏览器中打开查看,或者如果你在使用Jupyter Notebook,可以使用IFrame显示图表。

完整代码:

import pandas as pd
from pyecharts.charts import Geo
from pyecharts import options as opts

# 读取Excel文件
df = pd.read_excel('2020-2024届近5年通信就业数据.xlsx')

# 假设您已经有一个包含省份和就业人数的 DataFrame
# 这里我们模拟一下这个 DataFrame
# 注意:这只是一个示例,您需要根据实际情况调整
employment_data = pd.DataFrame({
    'Province': ['北京', '上海', '广东', '江苏'],
    'Employment': [100, 120, 150, 80]
})

# 假设 extract_province 函数已经正确定义(这里不需要,因为我们已经有了省份数据)
# ...

# 创建 Geo 地图
geo = Geo()
# 添加数据,这里直接使用 employment_data DataFrame
geo.add_schema(maptype="china")
geo.add("就业人数", [(row.Province, row.Employment) for index, row in employment_data.iterrows()])
geo.set_global_opts(
    title_opts=opts.TitleOpts(title="大数据技术专业学生就业地域分布"),
    visualmap_opts=opts.VisualMapOpts(max_=employment_data['Employment'].max()),
)

# 渲染图表到HTML文件
geo.render('employment_map.html')

bc658a9091564059876ea612f76c8909.pngd8da38124a9d414f8dfc8c436b92ab0c.gif

结论

       通过本文介绍的方法,你可以将通信就业数据以地图可视化的形式展示出来,从而直观地了解各省份的就业分布情况。尽管原始数据中没有直接的地理位置信息,但通过额外的数据收集和处理步骤,我们仍然能够实现这一目标。此外,pyecharts库提供了丰富的配置选项,允许你根据需要调整图表的样式和功能。

最后的最后,小北希望这篇博客对友友你有所帮助,如果你有任何问题或建议,欢迎在评论区留言~

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-SQL-语句执行流程

已查询为例 首先我们可以看到,在查询的时候Mapper对象已经是被代理过后的: 所以会执行invoke方法,其底层实现就是JDK的动态代理: 如下图所示,如果MethodCache里面存在方法,则判断这个方法是否为default方…

STM32:TIM中断配置应用(1)呼吸灯:库函数讲解笔记+代码讲解笔记

声明:本博客为哔哩哔哩up主江协科技 “STM32入门教程”的听课笔记,仅供学习、参考使用,不得用作其他用途,违者必究。如有版权问题,请联系作者修改。 目录 一、综述 二、TIM库(有关输出比较的函数&#x…

【如何下载Landsat数据】

下载Landsat数据可以通过多种途径实现,主要包括使用官方网站、第三方平台和专门的软件库等。以下是一些常用的方法: 1. 使用USGS官方网站 EarthExplorer(earthexplorer.usgs.gov) 注册账号:首先,需要在…

10-python格式化字符串的四种方法(%,format,f-string,string template)

3 f-string (格式化字符串) in Python 自 Python 3.6 引入以来,f-string 提供了一种更加简洁和直观的方式来进行字符串格式化。其语法简单明了:只需在字符串前加上字母 f 或 F,并在字符串中使用 {} 来包裹需要插入的内容。 它相比于之前的%格式化和字符串format方法写起来更…

【R语言】基于Biomod2集成平台探究物种分布区的构建流程(SDMs)(持续更新中。。。。。。)

Species Distribution Models 1.写在前面2.物种分布模型介绍3.输入数据准备及预处理3.1.如何从GBIF网站上获取分布点数据(基于rgbif包)3.2.分布点稀疏处理(基于spThin函数)3.3.如何获取环境变量数据(基于getData函数&a…

兴业月报|八月法拍房市场套均成交折扣降至6.9折

导读 8月北京法拍房成交房源233套,成交总金额18.2891亿元,套均成交价784.94万元,总参拍人数890人,套均参拍人数3.81人,套均成交折扣6.9折。 ——兴业数据中心 2024年八月北京法拍房市场详细数据报告 2024.03-2024.0…

计算机网络 第1章 概述

文章目录 计算机网络概念计算机网络的组成计算机网络的功能三种数据交换技术电路交换(Circuit Switching)报文交换(message)分组交换 三种交换方式性能对比计算机网络的分类计算机网络的性能指标性能指标1:速率性能指标…

【mysql】mysql查询机制 调优不止是索引调优

前言:说到mysql调优 我们第一反应都是想到索引调优 应该这是最基本的 也是至关重要的;一般工作个两年 索引调优都可以掌握的八九不离十,相关数据结构特点也都能说个一二出来,所以本文重点是讲述其它机制 整体架构 连接器&#xff…

【C++】手动实现String类的封装(分文件编译)

实现了String类的大部分封装&#xff0c;采用分文件编译 //mystring.h #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring> using namespace std;class myString { private:char *str; //定义一个字符串int size; //记录字符串…

比亚迪方程豹携手华为乾崑智驾,加速中国智驾技术向前

近日&#xff0c;比亚迪方程豹与华为乾崑智驾在深圳签署合作协议&#xff0c;中国两大科技巨头强强联合&#xff0c;共同合作开发全球首个硬派专属智能驾驶方案&#xff0c;实现整车智驾深度融合&#xff0c;首发搭载在即将上市的方程豹豹8车型。 比亚迪智驾以自主研发和开放合…

MySQL之数据库基础

目录 一、数据库 1、基本概念 2、常见的数据库 3、MySQL数据库 连接MySQL服务器 数据逻辑存储 二、数据库和表的本质 三、SQL语句 四、服务器&#xff0c;数据库&#xff0c;表的关系 五、存储引擎 查看存储引擎 一、数据库 1、基本概念 一般来说&#xff0c;数据库…

【软件技巧】第33课,软件逆向安全工程师之如何快速的跑到某行代码EIP设置,每天5分钟学习逆向吧!

鼠标右键在此设置EIP EIP&#xff08;Extended Instruction Pointer&#xff09;是x86架构中一个重要的寄存器&#xff0c;它用于存储当前正在执行的指令的地址。EIP是程序计数器&#xff08;Program Counter&#xff09;的扩展版本&#xff0c;因为它是32位寄存器&#xff0c…

Centos安装node_exporter

使用以下命令下载最新版本的node_exporter, 地址: https://github.com/prometheus/node_exporter/releasesorter/releases&#xff1a; wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz或本地下载上传到服…

python 字典怎么提取value

打开编辑器&#xff0c;写上注释内容。 新建一个函数getvalue。 新建一个字典。 zidian{"country1":"america","country2":"australia","country3":"germany"} 利用values这个方法来获取字典中的所有Vlue值&…

浅析synchronized锁升级的原理与实现 1

目录 背景 锁的用法 底层实现 原理分析 锁的状态 锁升级 锁升级过程 锁升级简要步骤 锁升级细化流程 背景 在多线程编程中&#xff0c;线程同步是一个关键的概念&#xff0c;它确保了多个线程对共享资源的安全访问。Java中的synchronized关键字是一种常用的线程同步机制…

数据安全与个人信息保护的辨析

文章目录 前言一、合规1、合规的目标导向原则2、监管平衡的原则二、基础设施1、公共基础设施2、企业基础设施三、数据流通1、数据生产要素是数字化时代生产要素的变革理论2、数据产品的保护源自于数据产品的价值四、产品与服务1、数据安全与网络安全2、数据安全的分类分级与数据…

Qt-信号与槽

1. 认识信号和槽 Qt中&#xff0c;谈到信号&#xff0c;涉及到三个要素. 信号源&#xff1a;由哪个控件发出的信号信号的类型&#xff1a;用户进行不同的操作&#xff0c;就可能出发不同的信号 点击按钮&#xff0c;触发点击信号 在输入框中移动光标&#xff0c;触发移动光标的…

github私有仓库通过action部署hexo到公开仓库

github私有仓库通过action部署hexo到公开仓库 有一段时间一直将博客md文件直接放到公开仓库然后通过工作流action创建一个gh-page分支&#xff0c;来实现部署 但是这样做有一个问题&#xff0c;如果你的源文件&#xff0c;或者配置文件中有涉及变量&#xff0c;或者密钥key&a…

STM32G474之TIM1输出PWM互补信号(无死区时间和BKIN输入)

STM32G474之TIM1输出PWM互补信号&#xff0c;无死区时间&#xff0c;无BKIN输入。定时器1是16向上计数器&#xff0c;16向下计数器&#xff0c;16向上/向下计数器&#xff0c;输入时钟分频值&#xff1a;“1至65536”中的任意整数&#xff1b;捕获输入通道4个&#xff0c;比较输…

【C++ Primer Plus习题】9.4

问题: 解答: main.cpp #include <iostream> #include "sales.h" using namespace std; using namespace SALES;int main() {Sales s1, s2;double de[QUARTERS] { 12.1,32.1,42.1,51.1 };setSales(s1, de, QUARTERS);showSales(s1);cout << endl;setSal…