matplotlib 日期刻度和旋转[重复]

xwmevbvl  于 2023-06-23  发布在  其他
关注(0)|答案(6)|浏览(108)

此问题已在此处有答案

Rotate axis tick labels(13个回答)
14天前关闭
我在matplotlib中旋转日期刻度时遇到了问题。下面是一个小的示例程序。如果我尝试在结尾处旋转刻度,刻度不会旋转。如果我尝试旋转刻度,如注解'crashes'下所示,那么matplot lib会崩溃。
这仅在x值是日期时发生。如果我在avail_plot调用中将变量dates替换为变量t,则xticks(rotation=70)调用在avail_plot中工作正常。
有什么想法吗

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

def avail_plot(ax, x, y, label, lcolor):
    ax.plot(x,y,'b')
    ax.set_ylabel(label, rotation='horizontal', color=lcolor)
    ax.get_yaxis().set_ticks([])

    #crashes
    #plt.xticks(rotation=70)

    ax2 = ax.twinx()
    ax2.plot(x, [1 for a in y], 'b')
    ax2.get_yaxis().set_ticks([])
    ax2.set_ylabel('testing')

f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
    next_val = start + dt.timedelta(0,val)
    dates.append(next_val)
    start = next_val

avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()
wwwo4jvm

wwwo4jvm1#

如果您喜欢非面向对象的方法,可以将plt.xticks(rotation=70)移动到两个avail_plot调用的右 * 前 *,例如

plt.xticks(rotation=70)
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')

这将在设置标签之前设置旋转特性。由于这里有两个轴,在绘制两个图后,plt.xticks会混淆。当plt.xticks不做任何事情时,plt.gca()不会 * 给予你想要修改的轴,所以作用于当前轴的plt.xticks将不起作用。
对于不使用plt.xticks的面向对象方法,可以使用

plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
  • 在 * 两个avail_plot调用之后。这将在正确的轴上专门设置旋转。
ryevplcw

ryevplcw2#

matplotlib 2.1+

有一个axes方法tick_params可以改变刻度属性。它也作为set_tick_params轴方法存在

ax.tick_params(axis='x', rotation=45)

或者

ax.xaxis.set_tick_params(rotation=45)

顺便说一句,当前的解决方案通过使用命令plt.xticks(rotation=70)将有状态接口(使用pyplot)与面向对象接口混合使用。由于问题中的代码使用了面向对象的方法,所以最好始终坚持这种方法。该解确实给予了plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )的良好显式解

js4nwp54

js4nwp543#

一个简单的解决方案,避免循环在标签上是使用
fig.autofmt_xdate()
此命令自动旋转x轴标签并调整其位置。默认值为旋转Angular 30°和水平对齐“右”。但是它们可以在函数调用中改变

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right')

额外的bottom参数相当于设置plt.subplots_adjust(bottom=bottom),它允许将底部轴填充设置为更大的值以托管旋转的ticklabels。
基本上,在这里,您可以在一个命令中设置一个漂亮的日期轴。
good example可以在matplotlib页面上找到。

x8diyxa7

x8diyxa74#

另一种将horizontalalignmentrotation应用于每个刻度标签的方法是在要更改的刻度标签上执行for循环:

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

now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in range(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]
hours_value = np.random.random(len(hours))
days_value = np.random.random(len(days))

fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
axs[0].plot(hours,hours_value)
axs[1].plot(days,days_value)

for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment("right")

下面是一个例子,如果你想控制主刻度和次刻度的位置:

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

fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in range(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]

axs[0].plot(hours,np.random.random(len(hours)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.HourLocator(byhour = range(0,25,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[0].xaxis.set_major_locator(x_major_lct)
axs[0].xaxis.set_minor_locator(x_minor_lct)
axs[0].xaxis.set_major_formatter(x_fmt)
axs[0].set_xlabel("minor ticks set to every hour, major ticks start with 00:00")

axs[1].plot(days,np.random.random(len(days)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.DayLocator(bymonthday = range(0,32,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[1].xaxis.set_major_locator(x_major_lct)
axs[1].xaxis.set_minor_locator(x_minor_lct)
axs[1].xaxis.set_major_formatter(x_fmt)
axs[1].set_xlabel("minor ticks set to every day, major ticks show first day of month")
for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment("right")

xmjla07d

xmjla07d5#

我显然迟到了,但有一个官方的例子

plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

旋转标签,同时保持标签与刻度正确对齐,这既干净又容易。
参考:https://matplotlib.org/stable/gallery/images_contours_and_fields/image_annotated_heatmap.html

toe95027

toe950276#

简单使用

ax.set_xticklabels(label_list, rotation=45)

相关问题