通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python 如何实现双y轴

python 如何实现双y轴

使用Matplotlib库、适配不同的数据范围、提升图表的可读性

实现双y轴图表的一个常见方式是使用Matplotlib库。Matplotlib是Python中最强大的绘图库之一,能制作高质量的图表。通过使用twinx()方法,可以方便地在同一个图表中创建一个共享x轴的双y轴图表。这样可以适配不同的数据范围,提升图表的可读性。

具体实现步骤如下:

import matplotlib.pyplot as plt

创建数据

x = [0, 1, 2, 3, 4, 5]

y1 = [0, 1, 4, 9, 16, 25]

y2 = [0, 1, 2, 3, 4, 5]

fig, ax1 = plt.subplots()

绘制第一个y轴的图表

ax1.plot(x, y1, 'g-')

ax1.set_xlabel('X data')

ax1.set_ylabel('Y1 data', color='g')

创建第二个y轴

ax2 = ax1.twinx()

ax2.plot(x, y2, 'b-')

ax2.set_ylabel('Y2 data', color='b')

plt.show()

一、使用Matplotlib库

Matplotlib是Python最常用的绘图库之一,能够生成各类2D图表。通过Matplotlib,我们可以轻松地创建包括折线图、柱状图、散点图等在内的各种图表。使用twinx()方法,我们可以在同一个图表中添加一个共享x轴的双y轴。

基本绘图

首先,我们需要导入Matplotlib库并创建一个基本的图表。我们可以使用plt.subplots()方法创建一个包含单个子图的图表对象:

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots()

添加第一个y轴

接下来,我们可以在图表上绘制第一个y轴的数据。例如,可以使用ax1.plot()方法绘制数据,并设置y轴的标签:

x = [0, 1, 2, 3, 4, 5]

y1 = [0, 1, 4, 9, 16, 25]

ax1.plot(x, y1, 'g-')

ax1.set_xlabel('X data')

ax1.set_ylabel('Y1 data', color='g')

添加第二个y轴

为了添加第二个y轴,我们使用twinx()方法。这会创建一个新的y轴对象ax2,与第一个y轴共享相同的x轴:

ax2 = ax1.twinx()

y2 = [0, 1, 2, 3, 4, 5]

ax2.plot(x, y2, 'b-')

ax2.set_ylabel('Y2 data', color='b')

完整示例

综合上述步骤,我们可以得到一个完整的双y轴图表:

import matplotlib.pyplot as plt

创建数据

x = [0, 1, 2, 3, 4, 5]

y1 = [0, 1, 4, 9, 16, 25]

y2 = [0, 1, 2, 3, 4, 5]

fig, ax1 = plt.subplots()

绘制第一个y轴的图表

ax1.plot(x, y1, 'g-')

ax1.set_xlabel('X data')

ax1.set_ylabel('Y1 data', color='g')

创建第二个y轴

ax2 = ax1.twinx()

ax2.plot(x, y2, 'b-')

ax2.set_ylabel('Y2 data', color='b')

plt.show()

二、适配不同的数据范围

在实际应用中,不同的数据集可能具有不同的数值范围。使用双y轴可以帮助我们更好地适配这些数据范围,使得图表更易于理解。

示例1:不同量级的数据

考虑一个包含温度和湿度的数据集。温度以摄氏度为单位,而湿度以百分比为单位。两个数据集的数值范围可能非常不同:

import matplotlib.pyplot as plt

创建数据

x = range(0, 24)

temperature = [15, 16, 17, 18, 20, 22, 25, 28, 30, 32, 33, 34, 35, 34, 33, 31, 29, 27, 24, 22, 20, 18, 17, 16]

humidity = [80, 82, 85, 88, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 25, 30, 35, 40, 45]

fig, ax1 = plt.subplots()

绘制温度数据

ax1.plot(x, temperature, 'r-')

ax1.set_xlabel('Time (hours)')

ax1.set_ylabel('Temperature (C)', color='r')

创建第二个y轴

ax2 = ax1.twinx()

ax2.plot(x, humidity, 'b-')

ax2.set_ylabel('Humidity (%)', color='b')

plt.show()

示例2:股票价格与成交量

另一个常见的应用场景是股票价格与成交量。股票价格和成交量的数据范围通常差异很大,通过双y轴可以更好地展示这两类数据:

import matplotlib.pyplot as plt

创建数据

dates = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

prices = [100, 101, 102, 101, 99, 98, 97, 96, 95, 94]

volumes = [200, 220, 210, 230, 240, 250, 260, 270, 280, 290]

fig, ax1 = plt.subplots()

绘制股票价格

ax1.plot(dates, prices, 'g-')

ax1.set_xlabel('Date')

ax1.set_ylabel('Stock Price', color='g')

创建第二个y轴

ax2 = ax1.twinx()

ax2.bar(dates, volumes, alpha=0.6, color='b')

ax2.set_ylabel('Volume', color='b')

plt.show()

三、提升图表的可读性

为了提升图表的可读性,我们可以对图表进行一些美化和调整。包括添加标题、图例、网格线等。

添加标题和图例

为图表添加标题和图例可以帮助读者更好地理解图表的内容:

import matplotlib.pyplot as plt

创建数据

x = range(0, 24)

temperature = [15, 16, 17, 18, 20, 22, 25, 28, 30, 32, 33, 34, 35, 34, 33, 31, 29, 27, 24, 22, 20, 18, 17, 16]

humidity = [80, 82, 85, 88, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 25, 30, 35, 40, 45]

fig, ax1 = plt.subplots()

绘制温度数据

ax1.plot(x, temperature, 'r-', label='Temperature')

ax1.set_xlabel('Time (hours)')

ax1.set_ylabel('Temperature (C)', color='r')

创建第二个y轴

ax2 = ax1.twinx()

ax2.plot(x, humidity, 'b-', label='Humidity')

ax2.set_ylabel('Humidity (%)', color='b')

添加标题和图例

fig.suptitle('Temperature and Humidity Over Time')

ax1.legend(loc='upper left')

ax2.legend(loc='upper right')

plt.show()

添加网格线

网格线可以帮助读者更容易地读取数据值。我们可以使用grid()方法添加网格线:

import matplotlib.pyplot as plt

创建数据

x = range(0, 24)

temperature = [15, 16, 17, 18, 20, 22, 25, 28, 30, 32, 33, 34, 35, 34, 33, 31, 29, 27, 24, 22, 20, 18, 17, 16]

humidity = [80, 82, 85, 88, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 25, 30, 35, 40, 45]

fig, ax1 = plt.subplots()

绘制温度数据

ax1.plot(x, temperature, 'r-', label='Temperature')

ax1.set_xlabel('Time (hours)')

ax1.set_ylabel('Temperature (C)', color='r')

ax1.grid(True)

创建第二个y轴

ax2 = ax1.twinx()

ax2.plot(x, humidity, 'b-', label='Humidity')

ax2.set_ylabel('Humidity (%)', color='b')

ax2.grid(False)

添加标题和图例

fig.suptitle('Temperature and Humidity Over Time')

ax1.legend(loc='upper left')

ax2.legend(loc='upper right')

plt.show()

自定义x轴和y轴的刻度

自定义轴的刻度可以使图表更易于阅读。可以使用set_xticks()set_yticks()方法自定义刻度:

import matplotlib.pyplot as plt

创建数据

x = range(0, 24)

temperature = [15, 16, 17, 18, 20, 22, 25, 28, 30, 32, 33, 34, 35, 34, 33, 31, 29, 27, 24, 22, 20, 18, 17, 16]

humidity = [80, 82, 85, 88, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 25, 30, 35, 40, 45]

fig, ax1 = plt.subplots()

绘制温度数据

ax1.plot(x, temperature, 'r-', label='Temperature')

ax1.set_xlabel('Time (hours)')

ax1.set_ylabel('Temperature (C)', color='r')

ax1.grid(True)

ax1.set_xticks(range(0, 24, 2)) # 设置x轴刻度

ax1.set_yticks(range(15, 36, 5)) # 设置y轴刻度

创建第二个y轴

ax2 = ax1.twinx()

ax2.plot(x, humidity, 'b-', label='Humidity')

ax2.set_ylabel('Humidity (%)', color='b')

ax2.grid(False)

ax2.set_yticks(range(20, 101, 10)) # 设置y轴刻度

添加标题和图例

fig.suptitle('Temperature and Humidity Over Time')

ax1.legend(loc='upper left')

ax2.legend(loc='upper right')

plt.show()

四、其他高级用法

除了基础的双y轴绘图,Matplotlib还提供了许多高级特性,可以满足更多复杂的需求。

不同类型的图表组合

我们可以在同一个图表中组合不同类型的图表。例如,可以将折线图和柱状图组合在一起:

import matplotlib.pyplot as plt

创建数据

x = range(0, 24)

temperature = [15, 16, 17, 18, 20, 22, 25, 28, 30, 32, 33, 34, 35, 34, 33, 31, 29, 27, 24, 22, 20, 18, 17, 16]

humidity = [80, 82, 85, 88, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 25, 30, 35, 40, 45]

fig, ax1 = plt.subplots()

绘制温度数据(折线图)

ax1.plot(x, temperature, 'r-', label='Temperature')

ax1.set_xlabel('Time (hours)')

ax1.set_ylabel('Temperature (C)', color='r')

ax1.grid(True)

创建第二个y轴

ax2 = ax1.twinx()

ax2.bar(x, humidity, alpha=0.6, color='b', label='Humidity')

ax2.set_ylabel('Humidity (%)', color='b')

ax2.grid(False)

添加标题和图例

fig.suptitle('Temperature and Humidity Over Time')

ax1.legend(loc='upper left')

ax2.legend(loc='upper right')

plt.show()

添加注释

在图表中添加注释可以帮助读者更好地理解数据。可以使用annotate()方法添加注释:

import matplotlib.pyplot as plt

创建数据

x = range(0, 24)

temperature = [15, 16, 17, 18, 20, 22, 25, 28, 30, 32, 33, 34, 35, 34, 33, 31, 29, 27, 24, 22, 20, 18, 17, 16]

humidity = [80, 82, 85, 88, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 25, 30, 35, 40, 45]

fig, ax1 = plt.subplots()

绘制温度数据(折线图)

ax1.plot(x, temperature, 'r-', label='Temperature')

ax1.set_xlabel('Time (hours)')

ax1.set_ylabel('Temperature (C)', color='r')

ax1.grid(True)

添加注释

ax1.annotate('Peak Temperature', xy=(12, 35), xytext=(15, 30),

arrowprops=dict(facecolor='black', shrink=0.05))

创建第二个y轴

ax2 = ax1.twinx()

ax2.bar(x, humidity, alpha=0.6, color='b', label='Humidity')

ax2.set_ylabel('Humidity (%)', color='b')

ax2.grid(False)

添加标题和图例

fig.suptitle('Temperature and Humidity Over Time')

ax1.legend(loc='upper left')

ax2.legend(loc='upper right')

plt.show()

自定义颜色和样式

我们可以自定义图表的颜色和样式,使其更符合我们的需求:

import matplotlib.pyplot as plt

创建数据

x = range(0, 24)

temperature = [15, 16, 17, 18, 20, 22, 25, 28, 30, 32, 33, 34, 35, 34, 33, 31, 29, 27, 24, 22, 20, 18, 17, 16]

humidity = [80, 82, 85, 88, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 25, 30, 35, 40, 45]

fig, ax1 = plt.subplots()

绘制温度数据(折线图)

ax1.plot(x, temperature, 'r--', label='Temperature') # 自定义线条样式

ax1.set_xlabel('Time (hours)')

ax1.set_ylabel('Temperature (C)', color='r')

ax1.grid(True)

创建第二个y轴

ax2 = ax1.twinx()

ax2.bar(x, humidity, alpha=0.6, color='b', label='Humidity')

ax2.set_ylabel('Humidity (%)', color='b')

ax2.grid(False)

添加标题和图例

fig.suptitle('Temperature and Humidity Over Time')

ax1.legend(loc='upper left')

ax2.legend(loc='upper right')

plt.show()

通过以上方式,我们可以利用Matplotlib库实现功能丰富的双y轴图表,适配不同的数据范围,提升图表

相关问答FAQs:

如何在Python中创建双Y轴图?
要在Python中创建双Y轴图,可以使用Matplotlib库。通过创建一个图形对象并添加两个Y轴,可以轻松实现这一点。首先,需要安装Matplotlib库,然后使用twinx()方法创建第二个Y轴。以下是一个基本的示例代码:

import matplotlib.pyplot as plt

# 示例数据
x = [1, 2, 3, 4, 5]
y1 = [10, 20, 25, 30, 35]
y2 = [5, 15, 20, 25, 30]

# 创建图形和第一个Y轴
fig, ax1 = plt.subplots()

# 绘制第一个Y轴的数据
ax1.plot(x, y1, 'g-', label='Y1 Data')
ax1.set_ylabel('Y1 Axis', color='g')

# 创建第二个Y轴
ax2 = ax1.twinx()
ax2.plot(x, y2, 'b-', label='Y2 Data')
ax2.set_ylabel('Y2 Axis', color='b')

# 显示图例
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')

plt.show()

使用双Y轴时需要注意什么?
在使用双Y轴时,确保两个Y轴的量纲和数据范围有所不同,以避免混淆读者。合理选择颜色和线型,确保图形清晰易读。此外,图例的位置也要适当,以便观众能够轻松理解每个数据系列的含义。

有哪些常用的Python库支持双Y轴绘图?
除了Matplotlib外,还有其他一些Python库可以支持双Y轴绘图,例如Seaborn和Plotly。Seaborn是一个基于Matplotlib的高级图形库,具有更简洁的API,而Plotly则是一个交互式绘图库,可以创建动态和响应式的图形。选择合适的库可以根据具体需求和使用场景。

相关文章