python画双y轴图像

很多时候可能需要在一个图中画出多条函数图像,但是可能y轴的物理含义不一样,或是数值范围相差较大,此时就需要双y轴。

matplotlib和seaborn都可以画双y轴图像。一个例子:

import seaborn as sns
import matplotlib.pyplot as plt

# ax1 for KDE, ax2 for CDF

f, ax1 = plt.subplots()
ax1.grid(True)
# ax1.set_ylim(0, 1)
ax1.set_ylabel('KDE')
ax1.set_xlabel('DATA')
ax1.set_title('KDE + CDF')
ax1.legend(loc=2)
sns.kdeplot(data, ax=ax1, lw=2, label='KDE') # KDE

ax2 = ax1.twinx() # the reason why it works
ax2.set_ylabel('CDF')
ax2.legend(loc=1)
ax2.hist(data, bins=50, cumulative=True, normed=True, histtype='step', color='red', lw=2, label='CDF') # CDF

plt.show()

 

### 使用 Python Matplotlib 实现 Y 折线图 为了创建具有两个不同尺度的 y 的数据可视化图形,可以利用 `matplotlib` 库中的功能来完成此操作。下面展示了一个具体的例子,该实例展示了如何在同一张图表上绘制两条不同的时间序列数据,并分别为它们配置独立的左侧和右侧 y 。 #### 创建 Y 折线图 ```python import numpy as np from datetime import datetime, timedelta import matplotlib.pyplot as plt # 构造一些模拟的时间序列数据 dates = [datetime.now() + timedelta(days=i) for i in range(10)] data_left_axis = (np.random.rand(10)-0.5).cumsum() data_right_axis = 10 * (np.random.rand(10)).cumsum() fig, ax1 = plt.subplots(figsize=(8, 6)) color = 'tab:red' ax1.set_xlabel('日期') ax1.set_ylabel('左数值', color=color) line1, = ax1.plot(dates, data_left_axis, color=color, label='左数据') # 左侧y的数据 ax1.tick_params(axis='y', labelcolor=color) # Instantiating a second axes that shares the same x-axis but has its own scale on the right side. ax2 = ax1.twinx() color = 'tab:blue' ax2.set_ylabel('右数值', color=color) line2, = ax2.plot(dates, data_right_axis, '--', color=color, label='右数据') # 右侧y的数据 ax2.tick_params(axis='y', labelcolor=color) plt.title("Y折线图示例") lines = [line1, line2] labels = [l.get_label() for l in lines] # 将来自两个坐标系的对象组合起来用于显示统一的图例 ax1.legend(lines, labels, loc='upper center') fig.tight_layout() plt.show() ``` 这段代码首先定义了两组随机生成的时间序列数据作为演示用途;接着通过调用 `twinx()` 方法为现有的 Axes 对象添加一个新的共享 X 坐标的 Axes 对象,从而允许同时存在两个垂直方向上的比例尺[^1]。 对于多系列柱状图的情况,则可以通过指定参数 `width` 来控制柱子宽度并适当调整位置偏移量以防止重叠: #### 多系列柱状图 ```python import pandas as pd import seaborn as sns sns.set_theme(style="whitegrid") # Load an example dataset with nested grouping of beeswarm points tips = sns.load_dataset("tips").groupby(['day','sex']).mean().reset_index() days = ["Thur", "Fri", "Sat", "Sun"] colors = {"Male": "#7fc97f", "Female": "#beaed4"} fig, ax = plt.subplots(figsize=(8, 6)) for gender, group_data in tips.groupby('sex'): offset = (-0.2 if gender == 'Male' else 0.2) p = ax.bar(group_data['day'] + offset, group_data['total_bill'], width=0.4, align='center', alpha=0.7, color=colors[gender], edgecolor='black', label=f'{gender} 性别的平均消费金额') ax.set_xticks(range(len(days))) ax.set_xticklabels(days) ax.set_title('按性别分的日均账单总额对比') ax.set_ylabel('总金额 ($)') ax.legend(title='性别') plt.show() ``` 上述脚本使用 Seaborn 加载内置的小费数据集,并按照星期几以及顾客性别进行了汇总统计。之后分别针对男性和女性客户群体构建了相邻而不互相覆盖的直方条形图[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值