首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【原创佳作】介绍Pandas实战中一些高端玩法
2
pandas 如何实现 excel 中的汇总行?
3
pandas多级索引的骚操作!
4
40000字 Matplotlib 实操干货,真的全!
5
利用Python搞定女朋友的小情绪~
6
Python 绘制惊艳的瀑布图
7
6种方式创建多层索引
8
Python 进阶指南(编程轻松进阶):三、使用 Black 工具来格式化代码
9
数据科学 IPython 笔记本 9.6 聚合:最小、最大和之间的任何东西
10
精通 Pandas 探索性分析:1~4 全
11
高手系列!数据科学家私藏pandas高阶用法大全 ⛵
12
总结了67个pandas函数,完美解决数据处理,拿来即用!
13
PyAutoGUI,一个Python办公自动化利器!
14
解放双手|利用 PyAutoGUI 快速构建自动化操作脚本
15
Python中内置数据库!SQLite使用指南! ⛵
16
数据分析索引总结(中)Pandas多级索引
17
数据分析索引总结(下)Pandas索引技巧
18
数据分析索引总结(上)Pandas单级索引
19
网友需求系列01-Python-matplotlib定制化刻度(主副)绘制
20
用Python自动生成数据分析报告
21
手把手教你用Python操纵Word自动编写离职报告
22
pandas transform 数据转换的 4 个常用技巧!
23
30段极简Python代码:这些小技巧你都Get了么
24
数据处理遇到麻烦不要慌,5个优雅的Numpy函数助你走出困境
25
数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(上)
26
数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(下)
27
数据分析之Pandas变形操作总结
28
数据分析之Pandas缺失数据处理
29
数据分析之Pandas合并操作总结
30
数据分析之Pandas分组操作总结
31
学习用Pandas处理分类数据!
32
如何用Pandas处理文本数据?
33
Pandas处理时序数据(初学者必会)!
34
Python高阶函数使用总结!
35
机器学习在金融风控的经验总结!
36
你知道怎么用Pandas绘制带交互的可视化图表吗?
37
6个提升效率的pandas小技巧
38
Python数据分析库pandas高级接口dt和str的使用
39
pandas 拼接 concat 5 个常用技巧!
40
pandas分组8个常用技巧!
41
pandas 文本处理大全
42
pandas 筛选数据的 8 个骚操作
43
pandas 分类数据处理大全(附代码)
44
68 个Python内置函数,你用过几个?
45
太秀了!用 pandas 搞定 24 张 Excel 报表
46
用 Python 的 Template 类生成文件报告
47
码如其人,同学你能写一手漂亮的Python函数吗
48
Python处理图片九宫格,炫酷朋友圈
49
Python排序傻傻分不清?一文看透sorted与sort用法
50
python-docx操作word文件(
清单首页python文章详情

网友需求系列01-Python-matplotlib定制化刻度(主副)绘制

今天我们开始「粉丝要求绘图系列」的第一篇推文 ,这个系列我会筛选出需求较多的一类图进行绘制讲解,当然,绘图的数据我们尽可能的全部分享出来(即使涉及一些论文数据,我们也会根据情况进行虚构处理的),本期的推文重要涉及的知识点如下:

  • Python-matplotlib 定制化图例绘制
  • Python-双Y轴绘制图表元素完善
  • 双Y轴图例等熟悉添加

Python-matplotlib 定制化图例绘制

本期的推文绘制我们的参考图例来源于以下图表:

可以看出:

  1. 图表是双Y轴的绘制
  2. 图表的x轴刻度绘制较为复杂(也是本期的重点内容),如下:

由于没有原始数据,我们使用Python进行虚构,构造的数据预览如下(部分):

data列用于绘制柱形图(bar plot),line_data列用于绘制第二个Y轴的点线图(line plot)

数据处理

通过观察原始图表,我们可以知道,原图的x轴刻度是一年的12个月份,即[2,4,6,8,10,12]的重复,由于较难对刻度进行ticker的编写,这里我们直接采用最粗暴的方法-直接命名刻度label方法进行操作,构建方式如下:

代码语言:javascript
复制
tick_label = ['',"2",'','4','','6','','8','','10','','12']*4

这里我是虚构的4年数据哈,而使用‘’用于替代不显示的[1,3,5,7,9,11]的刻度位置,接下来我们直接绘图。

初步绘图探索

要想绘制该类刻度形式,我们就需要灵活操作主(major)、副(minor)刻度范围及刻度label,绘图代码如下:

代码语言:javascript
复制
from matplotlib.pyplot import MultipleLocator

plt.rcParams['font.family'] = "Times New Roman"
x = np.arange(len(data_all_df))

fig,ax = plt.subplots(figsize=(9,5),dpi=100)
bar_plot = ax.bar(x,data_all_df["data"].values,color="gray",width=.5)
#定制化操作
#设置轴范围
ax.set_ylim(bottom=-30,top=300)
ax.set_xlim(left=-.7,right=47.7)
ax.set_xticks(x) #设置这一步操作,要不然刻度往左移
ax.spines["top"].set_visible(False)
#设置x轴刻度label
ax.set_xticklabels(tick_label)

#设置主副刻度
#把x轴的主刻度间隔设置为.5,并存在变量里
x_major_locator=MultipleLocator(1)
#把x轴的副刻度间隔设置为.5,并存在变量里
x_minor_locator=MultipleLocator(.5)
#调用刻度设置
ax.xaxis.set_minor_locator(x_minor_locator)
ax.xaxis.set_major_locator(x_major_locator)


ax.tick_params(axis='y',direction='in',labelsize=8,length=3.5)
ax.tick_params(axis='x',which="major",direction='in',bottom=False,labelsize=8,length=3,width=.4)
#定制化副刻度

ax.tick_params(axis="x",which="minor",direction="out",length=10,width=.4)
#设置刻度轴脊的位置:较重要的方法
ax.spines['bottom'].set_position(('data', 0))

知识点:

  1. 设置主副刻度
代码语言:javascript
复制
x_major_locator=MultipleLocator(1)
#把x轴的副刻度间隔设置为.5,并存在变量里
x_minor_locator=MultipleLocator(.5)
#调用刻度设置
ax.xaxis.set_minor_locator(x_minor_locator)
ax.xaxis.set_major_locator(x_major_locator)
  1. 刻度形式操作
代码语言:javascript
复制
ax.tick_params(axis='y',direction='in',labelsize=8,length=3.5)
ax.tick_params(axis='x',which="major",direction='in',bottom=False,labelsize=8,length=3,width=.4)
ax.tick_params(axis="x",which="minor",direction="out",length=10,width=.4)
  1. 设置刻度轴脊的位置:较重要的方法
代码语言:javascript
复制
ax.spines['bottom'].set_position(('data', 0))

可视化结果如下:

我们可以发现,图中的刻度已经蛮符合胡子hi要求了(如下):

但是当我继续想添加年份的分割刻度时,已这种方式为基础的绘图将很难实现,最终我们选择直接主刻度定义年份,副刻度定义月份的操作,通过对其定制化操作,达到我们的绘图需求。

绘图完善

这里我们直接给出代码,如下:

代码语言:javascript
复制
from matplotlib.pyplot import MultipleLocator
import matplotlib.ticker as ticker
plt.rcParams['font.family'] = "Times New Roman"

x = np.arange(len(data_all_df))
fig,ax = plt.subplots(figsize=(9,5),dpi=100)
bar_plot = ax.bar(x,data_all_df["data"].values,color="gray",width=.5,label="Bar Charts",zorder=2)
#定制化操作
ax.set_ylabel("Bar_Data_Value",size=12)
ax.set_xlabel("Month",size=12,labelpad=15)
#ax.set_xlabel()
ax.set_ylim(bottom=0,top=300)
ax.set_xlim(left=-.5,right=47.5)
#设置主刻度
ax.set_xticks(np.arange(-.5, 48.5, step=12)) #设置这一步操作,要不然刻度往左移
#设置副刻度
ax.set_xticks(np.arange(0, 48, step=1),minor=True)

ax.spines["top"].set_visible(False)
#设置副刻度label
ax.set_xticklabels(tick_label,minor=True)
#添加 年数文本作为X轴信息
for i,text in zip([.125,.375,.625,.875],['2014','2015','2016','2017']):
    ax.text(i,-.08,text,transform = ax.transAxes,va="center",ha="center",fontweight="bold")
#或者如下操作设置主刻度
# positions = [-.5,11.5,23.5,35.5,47.5]
# ax.xaxis.set_major_locator(ticker.FixedLocator(positions))

#添加双y轴:使用Axes.twinx()方法绘制
second_plot = ax.twinx()
#注意:这里必须要有, 后面的图例才可以生成
line_plot, = second_plot.plot(np.arange(len(data_all_df)),data_all_df["line_data"].values,"-D",
                             ms=4,c="k",lw=.9,label="Line Charts")
second_plot.set_ylim((0,10000))
second_plot.tick_params(axis='y',direction='in',labelsize=10,length=3.5)
second_plot.set_ylabel("Line_Data_Value",size=12)
second_plot.set_axisbelow(True)
second_plot.spines["top"].set_visible(False)
ax.tick_params(axis='y',direction='in',labelsize=10,length=3.5)
ax.tick_params(axis='x',which="major",direction='out',labelbottom=False,length=25,width=.5)
ax.tick_params(axis="x",which="minor",bottom=False,direction="out",length=3,width=.4,pad=.01)
ax.set_axisbelow(True)

# #添加图例
charts = [bar_plot, line_plot]
ax.legend(charts, [l.get_label() for l in charts],frameon=False)

plt.savefig(r'\double_y_axis_plot_excise.png',width=7,height=3,
            dpi=900,bbox_inches='tight',facecolor='white')

知识点:

  1. 定义刻度位置及间隔
代码语言:javascript
复制
#设置主刻度
ax.set_xticks(np.arange(-.5, 48.5, step=12)) 
#设置副刻度
ax.set_xticks(np.arange(0, 48, step=1),minor=True)
  1. 使用Axes.twinx()添加双轴
代码语言:javascript
复制
second_plot = ax.twinx()
#注意:这里必须要有, 后面的图例才可以生成
line_plot, = second_plot.plot(np.arange(len(data_all_df)),data_all_df["line_data"].values,"-D",
                             ms=4,c="k",lw=.9,label="Line Charts")

注意:这里必须要有, 后面的图例才可以生成3. 定制年份的刻度label文本

代码语言:javascript
复制
#添加 年数文本作为X轴信息
for i,text in zip([.125,.375,.625,.875],['2014','2015','2016','2017']):
    ax.text(i,-.08,text,transform = ax.transAxes,va="center",ha="center",fontweight="bold")
  1. 双Y轴图例添加
代码语言:javascript
复制
# #添加图例
charts = [bar_plot, line_plot]
ax.legend(charts, [l.get_label() for l in charts],frameon=False)

4.其他如刻度起始、间隔等设置大家可参考具体代码,根据自己需求进行修改。

最终我们的可视化结果如下:

总结

本篇推文较全面的练习了Python-matplotlib主副刻度的绘制 操作以及双Y轴图例的添加,大家可以好好参考下,为了大家更好的练习,我们也将提供练习数据和源码哦!获取方式如下:

绘制不易,感谢大家帮忙分享,关注本公众号(DataCharm)然后在公众号后台发送 网友系列01 即可获知数据、源码免费下载链接,

下一篇
举报
领券