繁体   English   中英

如何更改 matplotlib 中刻度标签的比例?

[英]How to change the scale of ticklabels in matplotlib?

我有一个问题,不仅涉及修改 xticklabel 文本,还涉及尝试逐日重新缩放它。

我用 Jan-01 到 Dec-31 的数据绘制了一个 plot,绘制的默认系列是以日期为索引的随机值。

日期 01-01 -16.0 01-02 -26.7 01-03 -26.7 01-04 -26.1 01-05 -15.0... 12-27 -13.8 12-28 -16.6 12-29 -15.0 12-30 -14.4 12 -31 -15.0 名称:Data_Value,长度:365,数据类型:float64

output 看起来一团糟,因为每个 xticklabel 都在那里,而旋转实际上是无用的。 我想将它们从几天重新调整为几个月,最佳做法是什么? 我写过一些这样的代码,但我认为它不够聪明。 有什么建议吗? 在此处输入图像描述

这是我的代码:

labels = [item.get_text() for item in ax.get_xticklabels()]
n = 0
for item in labels:
    n=n+1
    if n%15==0 and n%10 !=0:
        labels[n-1]= calendar.month_name[int(labels[n-1].split('-')[0])]
    else:
        labels[n-1]=''

ax.set_xticklabels(labels)
plt.show()

ax.set_xticklabels(labels) plt.show()`

这是结果: 在此处输入图像描述

让我们从必要的进口开始:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdate

我假设源数据是一个pandasonic DataFrame,创建如下:

ind = pd.date_range(start='2021-01-01', end='2021-12-31')
np.random.seed(0)  # To get repatable results
# Upper / lower values
upp = np.random.normal(loc=8, scale=0.5, size=ind.size)
low = np.random.normal(loc=3, scale=0.4, size=ind.size)
# This will be used below
df = pd.DataFrame({'Upper': upp, 'Lower': low}, index = ind)

和:

  • 包含一年中连续日期的索引,
  • 下部上部列包含两条曲线的值。

使用“每月” x轴标签生成 plot 的可能解决方案之一是:

fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(df)
ax.fill_between(df.index, df.Upper, df.Lower, alpha=0.1)
ax.set_ylim(0, 10)
locator = mdate.MonthLocator()
fmt = mdate.DateFormatter('%b')
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(fmt)
plt.show()

结果是:

在此处输入图像描述

请注意,您有两个Jan标签,一个代表年初,第二个代表年底。

我的假设是,当您绘制日期时,您的日期仍然是字符串格式。 尝试将它们转换为日期时间格式,然后 matplot 应该从那里完成繁重的工作。 此外,您可以使用plt.xticks(size = 20)或任何您想要的尺寸来缩放刻度标签。 例子:

import pandas as pd
import matplotlib.pyplot as plt

dates = ['19 March 2022', '20 March 2022', '21 March 2022', '22 March 2022', 
         '19 April 2022', '20 April 2022', '21 April 2022', '22 April 2022',
         '19 May 2022', '20 May 2022','21 May 2022','22 May 2022',
         '19 June 2022', '20 June 2022','21 June 2022','22 June 2022',
         '19 July 2022', '20 July 2022','21 July 2022','22 July 2022',
         '19 August 2022', '20 August 2022','21 August 2022','22 August 2022',
         '19 September 2022', '20 September 2022','21 September 2022','25 September 2022',
         '19 October 2022', '20 October 2022','21 October 2022','22 October 2022',
         '19 November 2022', '20 November 2022','21 November 2022','22 November 2022',
         '19 December 2022', '20 December 2022', '21 December 2022', '22 December 2022']
values = [1,2,3,4,
          1,2,3,4,
          1,2,3,4,
          1,2,3,4,
          1,2,3,4,
          1,2,3,4,
          1,2,3,4,
          1,2,3,4,
          1,2,3,4,
          1,2,3,4]
df = pd.DataFrame(zip(values, dates), columns = ['values', 'dates'])

plt.plot(df['dates'], df['values'])
plt.xticks(rotation=90, size = 20)
plt.show()

这给出了一个丑陋的 plot:

在此处输入图像描述

与转换后的日期 plot 相比,它看起来像这样:

df['converted_dates'] = pd.to_datetime(df.dates)

plt.plot(df['converted_dates'], df['values'])
plt.xticks(rotation=90, size = 20)
plt.show()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM