程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

Python使用Matplotlib库绘制双y轴图形(柱状图+折线图)

发布于2023-10-15 21:03     阅读(10406)     评论(1)     点赞(3)     收藏(1)


今天是第一次写踩坑日记系列,这个系列用来记录在Python和R学习过程中遇到的问题和结果。今天介绍的是使用Python的matplotlib库绘制两个y轴图的一些基本用法与踩坑行为。希望可以帮助到大家,也希望大家可以给出建议,欢迎留言交流。

Matplotlib介绍

Matplotlib是Python数据分析中常用的可视化工具,也是其他高级绘图接口(如seaborn, HoloViews, ggplot等)和专业绘图工具(如Cartopy)的基础。Matplotlib可以创建出版质量的图形,制作交互式的图形,自定义视觉风格和布局,导出到多种文件格式,嵌入在JupyterLab和图形用户界面中。更多探索内容请查看Matplotlib官网Matplotlib中文网

安装

pip install matplotlib

绘图元素

以下是 Matplotlib 图形的组件,来自于Matplotlib官网,详细使用方法查看快速入门指南 — Matplotlib 3.7.1 文档alt

设置标题或轴名称等文本标签内容时,如果含有中文字符出现乱码的情况,需要添加以下代码,如果仍然无法解决,可以尝试将SimHei字体改为FangSong等其他字体。

plt.rcParams['font.sans-serif']=['SimHei'] # 用来设置字体样式以正常显示中文标签(黑体)

如果数字为负数,也可能会乱码,解决方法为:

plt.rcParams['axes.unicode_minus']=False

Matplotlib提供了多种图形,包括基本的柱状图、折线图、散点图、箱线图、散点图、饼图等,还提供了极坐标图、3D图形等高级的可视化图形(如果不想看官方文档,可以查看知乎上的一篇文章学习绘制以上图形的基本方法),可以通过以上参数对图像细节进行修改,并且可以对各种图形进行组合。

双y轴图

画单y轴图

import numpy as np  
import matplotlib.pyplot as plt

# 生成一些示例数据
x = np.arange(10)
y = np.random.randint(0,20,10)

# 绘制折线图,设置颜色
plt.plot(x,y,color='blue')
# 设置x轴和y轴的标签,指明坐标含义
plt.xlabel('x轴', fontdict={'size': 16})
plt.ylabel('y轴', fontdict={'size': 16})
#设置图标题
plt.title('折线图')

# 设置中文显示
plt.rcParams['font.sans-serif']=['SimHei']
#展示图片
plt.show()

alt
#画柱状图
plt.bar(x,y,color='blue')#只要将以上代码中的`plot`改为`bar`
alt

双y轴折线图

import numpy as np  
import matplotlib.pyplot as plt

# 生成一些示例数据
x = np.arange(10)
y1 = np.random.randint(10, size=10)
y2 = np.random.randint(10, size=10)

# 创建一个图形和两个y轴
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
#绘制折线图
line1 = ax1.plot(x, y1,label='y1轴', color='royalblue', marker='o', ls='-.')
line2 = ax2.plot(x, y2, label='y2轴', color='tomato', marker=None, ls='--')

# 设置x轴和y轴的标签,指明坐标含义
ax1.set_xlabel('x轴', fontdict={'size': 16})
ax1.set_ylabel('y1轴',fontdict={'size': 16})
ax2.set_ylabel('y2轴',fontdict={'size': 16})
#添加图表题
plt.title('双y轴折线图')
#添加图例
plt.legend()
# 设置中文显示
plt.rcParams['font.sans-serif']=['SimHei']
#展示图片
plt.show()
alt

解决图例 通过以上方式设置的图例没有y1轴,并且也没有出现报错信息,说明两个图例都显示出来的,很有可能就是y2轴的图例将y1轴图例覆盖了。通过将两轴的图例分开显示后证明确实是覆盖掉了

#将`plt.legend()`改为以下代码
ax1.legend(loc='upper right')
ax2.legend(loc='upper left')
alt

但是两个图例分开显示也太丑了,还是希望可以将图例组合到一起

lines = line1 + line2  
labels = [h.get_label() for h in lines]
plt.legend(lines, labels, loc='upper right')
alt

设置轴 感觉这样看着有点不方便,如果把轴和线的颜色一致可能要好看一些

#设置轴标签颜色  
ax1.tick_params('y', colors='royalblue')
ax2.tick_params('y', colors='tomato')
#设置轴颜色
ax1.spines['left'].set_color('royalblue')
ax2.spines['left'].set_color('royalblue')
ax1.spines['right'].set_color('tomato')
ax2.spines['right'].set_color('tomato')
alt

两个y轴的颜色改变确实要好看一点,但是上轴线有点突兀,把它去掉

ax1.spines['top'].set_visible(False)  
ax2.spines['top'].set_visible(False)
alt

柱状图+折线图

把上边的y2改为柱状图,绘制柱状图与折线图双y轴图

import numpy as np  
import matplotlib.pyplot as plt
# 生成一些示例数据
x = np.arange(10)
y1 = np.random.randint(10, size=10)
y2 = np.random.randint(10, size=10)
# 创建一个图形和两个y轴
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
#绘制图形
bar = ax1.bar(x, y1, label='y1轴', color='tomato', width=0.4)
line = ax2.plot(x, y2,label='y2轴', color='royalblue', marker='o', ls='-.')
# 设置x轴和y轴的标签,指明坐标含义
ax1.set_xlabel('x轴', fontdict={'size': 16})
ax1.set_ylabel('y1轴',fontdict={'size': 16})
ax2.set_ylabel('y2轴',fontdict={'size': 16})
#添加图表题
plt.title('双y轴折线图')
#添加图例
lines = line + bar
labels = [h.get_label() for h in lines]
plt.legend(lines, labels, loc='upper right')
#设置轴标签颜色
ax1.tick_params('y', colors='royalblue')
ax2.tick_params('y', colors='tomato')
#设置轴颜色
ax1.spines['left'].set_color('royalblue')
ax2.spines['left'].set_color('royalblue')
ax1.spines['right'].set_color('tomato')
ax2.spines['right'].set_color('tomato')
#去掉上轴线
ax1.spines['top'].set_visible(False)
ax2.spines['top'].set_visible(False)
# 设置中文显示
plt.rcParams['font.sans-serif']=['SimHei']
#展示图片
plt.show()

哎嗨,报错了。matplotlib柱状图的返回值是一个BarContainer元组对象,而折线图的返回值是一个Line2D列表对象。 alt alt

使用matplotlib.pyplot.plot()函数来绘制一条折线,并将其返回值赋给一个变量,需要注意plot()函数返回的是一个包含一个Line2D对象的列表,而不是一个Line2D对象本身。所以,你需要在变量后面加上一个逗号,或者在使用get_label()方法时指定列表的索引为0,才能正确地获取Line2D对象的标签。所以将以上#绘制图形 模块改为

 
#绘制图形
bar = ax1.bar(x, y1, label='y1轴', color='tomato', width=0.4)
line, = ax2.plot(x, y2,label='y2轴', color='royalblue', marker='o', ls='-.')

alt

好了,今天的踩坑日记就到这里了,对于图的其它修改细节,大家可以自己尝试一下,多试试总能发现不同的坑。

本文由 mdnice 多平台发布

原文链接:https://blog.csdn.net/XIAOWANGaxs/article/details/131038484



所属网站分类: 技术文章 > 博客

作者:python好学吗

链接:https://www.pythonheidong.com/blog/article/2026456/4a7f36d062add740d0fd/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏
  • #1楼    2024-04-24 13:33:31    yedadav123 回复

    [url=https://www.freebestpost.com/finance]best cryptocurrency exchange[/url] She had been shopping with her Mom in Wal-Mart. She must have been 6 years old, this beautiful brown haired,

评论内容:(最多支持255个字符)