在线图中居中心x轴标签

时间:2017-04-03 14:32:10

标签: python matplotlib

我正在建造一条有两条线的线图,一条用于高温,另一条用于低温。 x轴基于日期时间格式的一年中的天数(2014-01-01等)。但是,我更改了标签 - 而不是数据 - 几个月(1月,2月,3月等)。问题是第一个标签'Jan'在原点。我想要的是将所有标签向右移动以使它们在刻度之间居中

fig, ax = plt.subplots()

plt.plot(x, y1)
plt.plot(x, y2)

# Change x-axis from %y-%m-%d format to %m:
monthsFmt = mdates.DateFormatter('%m')
plt.gca().xaxis.set_major_formatter(monthsFmt)

# Replace numeric x-axis labels (1,2,3, ..., 12) for abbreviations of months ('Jan', 'Feb', 'Mar', etc.):
labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
ax.set_xticklabels(labels)

# CODE GOES HERE TO CENTER X-AXIS LABELS...

# Render plot:
plt.show()

这是我正在寻找的结果

enter image description here

3 个答案:

答案 0 :(得分:1)

使用DavidG发布的帖子中建议的次要标记应该有效。下面是我针对您的具体问题进行调整的MWE,强制主要滴答在每个月的第一天出现,并使用次要滴答将标签置于主要滴答之间:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import datetime

# Generate some data for example :

yr = 2014
fig, ax = plt.subplots()

x0 = datetime.datetime(yr, 1, 1)
x = np.array([x0 + datetime.timedelta(days=i) for i in range(365)])

y1 = np.sin(2*np.pi*np.arange(365)/365) + np.random.rand(365)/5
y2 = np.sin(2*np.pi*np.arange(365)/365) + np.random.rand(365)/5 - 1

# Draw high and low temperatures lines :

ax.plot(x, y1, color='#c83c34')
ax.plot(x, y2, color='#28659c')
ax.fill_between(x, y2, y1, facecolor='#daecfd', alpha=0.5)

# Force the major ticks position on the first of each month and hide labels:

xticks = [datetime.datetime(yr, i+1, 1) for i in range(12)]
xticks.append(datetime.datetime(yr+1, 1, 1))
ax.set_xticks(xticks)
ax.tick_params(axis='both', direction='out', top=False, right=False)
ax.axis([xticks[0], xticks[-1], -2.5, 1.5])
ax.set_xticklabels([])

# CODE GOES HERE TO CENTER X-AXIS LABELS...

labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
mticks = ax.get_xticks()
ax.set_xticks((mticks[:-1]+mticks[1:])/2, minor=True)
ax.tick_params(axis='x', which='minor', length=0)
ax.set_xticklabels(labels, minor=True)
fig.tight_layout()

plt.show()

导致: Spring Data JPA - Reference Documentation

答案 1 :(得分:1)

通常在绘图时直接使用日期是有意义的。因此,代替手动设置标签的固定位置,可以使用matplotlib.dates定位符。要在月份的中间放置刻度线,可以选择每月的15号,

matplotlib.dates.MonthLocator(bymonthday=15)

完整示例:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as mticker
import random

df = pd.DataFrame(random.sample(range(10000),8760),
                  index = pd.date_range(start ='2013-01-01 00:00:00',
                                        end ='2013-12-31 23:30:00',
                                        freq='1H'),
                  columns =['value'])

fig, ax = plt.subplots()
ax.plot(df.index, df['value'])
ax.set_xlim(pd.Timestamp('2013-01-01 00:00:00'), pd.Timestamp('2013-12-31 23:30:00'))

months = mdates.MonthLocator(bymonth =(1,6,12), bymonthday=15 )
allmonths = mdates.MonthLocator()
m_fmt = mdates.DateFormatter('%b')
ax.xaxis.set_major_locator(allmonths)
ax.xaxis.set_minor_locator(months)

ax.xaxis.set_major_formatter(mticker.NullFormatter())
ax.xaxis.set_minor_formatter(m_fmt)
ax.tick_params(axis="x", which="minor", length=0)
plt.show()

enter image description here

答案 2 :(得分:0)

差不多,Jean-Sébastien。看起来一切都很完美但是上个月。它没有出现。

你的解决方案有点调整:

fig, ax = plt.subplots()

# Draw high and low temperatures lines:
plt.plot(x, y1, color = '#c83c34')
plt.plot(x, y2, color = '#28659c')

# Fill area between lines:
plt.gca().fill_between(x,
                       y2, y1,
                       facecolor='#daecfd',
                       alpha=0.5)

# Force major ticks on a monthly time scale only:
locator = mpl.dates.MonthLocator()
ax.xaxis.set_major_locator(locator)

# Hide major labels and set axis limits:
ax.set_xticklabels([])
ax.tick_params(axis='both', direction='out')
ax.axis(xmin=datetime.datetime(2014, 1, 1),
        xmax=datetime.datetime(2014, 12, 31),
        ymin=-50, ymax=50)

labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

mticks = ax.get_xticks()
ax.set_xticks((mticks[:-1]+mticks[1:])/2, minor=True)
ax.tick_params(axis='x', which='minor', length=0)
ax.set_xticklabels(labels, minor=True)

plt.show()

我得到的情节是这样的: enter image description here

有关在x轴标签中包含12月需要什么的任何线索?无论如何,非常感谢。