matplotlib 如何创建具有不同间隔的xtick?

vmjh9lq9  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(75)

我正在使用matplotlib绘制一个折线图,如下所示。

import matplotlib.pyplot as plt
import pandas as pd
import io

temp = u"""
tenor,yield
1M,5.381
3M,5.451
6M,5.505
1Y,5.393
5Y,4.255
10Y,4.109
"""

data = pd.read_csv(io.StringIO(temp), sep=",")
plt.plot(data['tenor'], data['yield'])

字符串
输出:x轴上的刻度间隔都相同。


的数据
我想要的:设置不同的x轴的刻度间隔,如下面的屏幕所示
有没有办法设置不同的tick intvel?


wwwo4jvm

wwwo4jvm1#

在列'tenor'中,'M'表示月份,'Y'表示年份。创建一个'Month'列,其中'Y'按12个月缩放。
直接使用pandas.DataFrame.plot绘制data,并使用.set_xticks更改xtick-labels,会更简洁。

python 3.12.0pandas 2.1.1matplotlib 3.8.0中测试

data = pd.read_csv(io.StringIO(temp), sep=",")

# Add a column "Month" from the the column "tenor"
data["Month"] = data['tenor'].apply(lambda x : int(x[:-1]) *12 if 'Y' in x else int(x[:-1]))

# plot yield vs Month
ax = data.plot(x='Month', y='yield', figsize=(17, 5), legend=False)

# set the xticklabels
_ = ax.set_xticks(data.Month, data.tenor)

字符串
输出:
x1c 0d1x的数据

.applylambda函数最快

  • 给定600万行
data = pd.DataFrame({'tenor': ['1M', '3M', '6M', '1Y', '5Y', '10Y'] * 1000000})

%timeit实现对比

  • .applylambda
%timeit data['tenor'].apply(lambda x: int(x[:-1]) *12 if 'Y' in x else int(x[:-1]))

2 s ± 50.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

  • .apply函数调用
def scale(x):
    v = int(x[:-1])
    return v * 12 if 'Y' in x else v

%timeit data['tenor'].apply(scale)

2.02 s ± 20.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

  • 矢量化np.whereassignment expression
%timeit np.where(data.tenor.str.contains('Y'), (v := data.tenor.str[:-1].astype(int)) * 12 , v)

2.44 s ± 26.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

  • 矢量化np.where,无assignment expression
%timeit np.where(data.tenor.str.contains('Y'), data.tenor.str[:-1].astype(int) * 12 , data.tenor.str[:-1].astype(int))

3.36 s ± 5.38 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

相关问题