Python:(使用matplotlib画图)次坐标轴,两个坐标轴

本文介绍如何利用Python的Matplotlib库和NumPy库创建具有两个Y轴的图表,通过示例代码展示了如何设置X轴、Y轴标签,以及如何在同一图表上绘制两组数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

代码如下

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.1)

y1 = 0.05 * x**2
y2 = -1 * y1

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(x,y1,'g-')
ax2.plot(x,y2,'b-')

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

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

plt.show()

 

<think>我们有一个需求:在使用matplotlib绘制对数坐标轴时,不希望坐标轴刻度标签显示为科学计数法(如1e5, 2e5等),而是希望以普通数字形式显示(如100000, 200000等)。 解决方法: 1. 使用`set_xscale('log')`或`set_yscale('log')`设置坐标轴为对数刻度。 2. 通过设置坐标轴的formatter(格式化器)来改变刻度标签的显示方式。具体来说,我们可以使用`ScalarFormatter`,并设置其一些属性来避免科学计数法。 关键点: - 默认情况下,对数坐标轴可能会使用`LogFormatter`,它会根据数值范围自动选择科学计数法或普通数字。但有时我们想要强制使用普通数字。 - 我们可以使用`ScalarFormatter`,它适用于线性轴,但也可以用于对数轴,只要我们设置合适的属性。 步骤: a) 创建`ScalarFormatter`对象。 b) 设置`set_scientific(False)`来禁用科学计数法。 c) 设置`set_useOffset(False)`来避免使用偏移量(即避免出现类似+1e5的偏移标注)。 d) 然后使用`ax.xaxis.set_major_formatter`或`ax.yaxis.set_major_formatter`应用这个格式化器。 注意:对于对数坐标轴,通常我们只设置主刻度标签的格式化器,因为次刻度标签通常不需要显示数字。 示例代码: 假设我们有一个图,x轴为对数刻度,并且我们不想让x轴刻度标签显示为科学计数法。 我们参考引用[3]中提到对数坐标轴的设置(使用semilogx等函数),但这里我们使用标准的subplots,然后单独设置。 下面是一个完整的示例:</think>### 在 Matplotlib 中设置对数坐标轴并禁用科学计数法 当使用 Matplotlib 设置对数坐标轴时,默认会以科学计数法显示刻度值(如 $10^4$)。要禁用科学计数法并以普通数字格式显示,可通过以下步骤实现: #### 解决方案 ```python import matplotlib.pyplot as plt import numpy as np # 创建数据 x = np.logspace(0, 5, 100) # 生成对数间隔数据 (10^0 到 10^5) y = np.sqrt(x) fig, ax = plt.subplots() # 1. 设置对数坐标轴 ax.set_xscale('log') # 2. 禁用科学计数法 ax.get_xaxis().set_major_formatter( plt.ScalarFormatter(useMathText=True) # 使用标量格式化器 ) ax.get_xaxis().get_major_formatter().set_scientific(False) # 禁用科学计数法 ax.get_xaxis().get_major_formatter().set_useOffset(False) # 禁用偏移值 # 3. 绘制图形 ax.plot(x, y, 'b-') ax.set_xlabel("X轴(对数刻度)", fontsize=12) ax.set_ylabel("Y值", fontsize=12) # 4. 优化坐标轴样式(参考引用[1]) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) ax.spines['left'].set_position(('data', 1)) # Y轴移动到x=1位置 plt.grid(True, which="both", ls="--", alpha=0.5) plt.tight_layout() plt.show() ``` #### 关键配置说明 1. **`set_major_formatter(plt.ScalarFormatter())`** 使用标量格式化器替代默认的对数格式化器,这是禁用科学计数法的关键[^3]。 2. **`set_scientific(False)`** 强制禁用科学计数法显示,使刻度值显示为完整数字(如 10000 而非 $1 \times 10^4$)。 3. **`set_useOffset(False)`** 禁用偏移值显示(如 `+1.5e4`),确保显示原始数值。 4. **`set_xscale('log')`** 保持对数坐标轴的数学特性,仅修改标签显示方式[^3]。 #### 效果对比 | 配置状态 | X轴刻度显示示例 | |---------|----------------| | 默认对数坐标 | $10^0, 10^1, 10^2, 10^3$ | | 禁用科学计数法 | 1, 10, 100, 1000 | > 此方法同样适用于Y轴对数刻度(`ax.set_yscale('log')`),且兼容 `semilogx()`/`semilogy()` 函数[^3]。 #### 高级优化 若需控制小数位数(如显示为 1000.0 而非 1000): ```python formatter = plt.ScalarFormatter() formatter.set_scientific(False) formatter.set_useOffset(False) formatter.set_powerlimits((0, 0)) # 强制始终显示小数 ax.xaxis.set_major_formatter(formatter) ``` --- ### 相关问题 1. 如何在对数坐标轴上自定义刻度位置和标签? 2. Matplotlib 中如何设置双对数坐标轴(log-log plot)? 3. 当数据范围过大时,如何优化对数坐标轴的刻度密度? 4. 除 `ScalarFormatter` 外,Matplotlib 还有哪些数值格式化器可用?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeniuHe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值