matplotlib 如何将Map值用于数字图表轴刻度

dy1byipe  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(84)

假设我有一个变量df,它包含一些在pandas中看起来像这样的数据

Date          Number Letter
2017-10-31    2      B
2019-08-31    1      A
2021-11-30    3      C
...

我想用seaborn把它画出来,所以我用了一些像这样的代码

sb.lineplot(data=df, x=Date, y=Number)
plt.show()

我得到一个有序的折线图,看起来像这样x1c 0d1x
但是,我希望让y轴标记标签,以保留数字列的数字顺序,但显示为字母列的标签。例如,与上面的y轴为10 - 17不同,我希望y轴读作j-t。
有没有一种方法可以通过sb.lineplot参数来实现,或者我需要另一种方法?

x6yk4ghg

x6yk4ghg1#

IIUC,您可以使用FixedLocatorFixedFormatter

import matplotlib.ticker as ticker

ax = sb.lineplot(data=df, x='Date', y='Number')
ax.yaxis.set_major_locator(ticker.FixedLocator(df['Number']))
ax.yaxis.set_major_formatter(ticker.FixedFormatter(df['Letter']))
plt.show()

输出:

wfauudbj

wfauudbj2#

  • 在y轴上绘制'Letter'更简单。
  • 如果y轴上的值需要特定顺序,则使用pd.Categorical设置'Letter'列。
  • categories=sorted(df.Letter, reverse=True),设置reverse=False,使A位于y轴的顶部。
      • python 3.11.3pandas 2.0.2matplotlib 3.7.1seaborn 0.12.2中测试**
import pnadas as pd
import seaborn as sns  # this is the standard alias
import matplotlib.pyplot as plt

# sample data
data = {'Date': ['2017-10-31', '2019-08-31', '2021-11-30'], 'Number': [2, 1, 3], 'Letter': ['B', 'A', 'C']}
df = pd.DataFrame(data)

# confirm the Date column is a datetime date dtype
df.Date = pd.to_datetime(df.Date).dt.date

# order the Letter column
df.Letter = pd.Categorical(df.Letter, categories=sorted(df.Letter, reverse=True))

# plot
fig = plt.figure(figsize=(10, 6))
ax = sns.lineplot(data=df, x='Date', y='Letter')

相关问题