Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib中的日期标记和旋转_Python_Matplotlib - Fatal编程技术网

Python matplotlib中的日期标记和旋转

Python matplotlib中的日期标记和旋转,python,matplotlib,Python,Matplotlib,我在matplotlib中尝试旋转日期刻度时遇到问题。下面是一个小样本程序。如果尝试在末尾旋转记号,则记号不会旋转。如果我尝试旋转记号,如注释“crasks”下所示,那么matplot库将崩溃 仅当x值为日期时才会发生这种情况。如果我在调用avail\u plot时将变量dates替换为变量t,则xticks(rotation=70)调用在avail\u plot内部工作正常 有什么想法吗 import numpy as np import matplotlib.pyplot as plt im

我在matplotlib中尝试旋转日期刻度时遇到问题。下面是一个小样本程序。如果尝试在末尾旋转记号,则记号不会旋转。如果我尝试旋转记号,如注释“crasks”下所示,那么matplot库将崩溃

仅当x值为日期时才会发生这种情况。如果我在调用
avail\u plot
时将变量
dates
替换为变量
t
,则
xticks(rotation=70)
调用在
avail\u 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()

如果您喜欢非面向对象的方法,请将
plt.xticks(rotation=70)
移动到两个
avail\u 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\u plot
调用之后。这将专门设置正确轴上的旋转。

另一种将
水平对齐
旋转
应用于每个记号标签的方法是对要更改的记号标签执行
循环:

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")

一个简单的解决方案是使用

此命令自动旋转xaxis标签并调整其位置。默认值为旋转角度30°和水平对齐“右”。但它们可以在函数调用中更改

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right')
附加的
bottom
参数相当于设置
plt.subplot\u adjust(bottom=bottom)
,它允许将底部轴填充设置为更大的值以承载旋转的标签

因此,基本上在这里,你有所有的设置,你需要有一个漂亮的日期轴在一个命令


可以在matplotlib页面上找到。

解决方案适用于matplotlib 2.1+

存在一种可以更改勾号属性的轴方法
tick_params
。它还作为轴方法存在,如
set\u tick\u params

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

作为旁注,当前解决方案通过使用命令
plt.xticks(rotation=70)
将有状态接口(使用pyplot)与面向对象接口混合使用。因为问题中的代码使用面向对象的方法,所以最好始终坚持这种方法。该解决方案确实提供了一个很好的显式解决方案,使用plt.setp(axs[1].xaxis.get_majorticklabels(),rotation=70)

只需使用

ax.set_xticklabels(label_list, rotation=45)

另一件方便的事情是:当您调用
plt.setp
时,您可以通过将多个参数指定为其他关键字参数来设置它们。
horizontalalignment
kwarg在旋转记号标签时特别有用:
plt.setp(axs[1].xaxis.get_majorticklabels(),rotation=70,horizontalalignment='right')
我不喜欢这个解决方案,因为它混合了pyplot和面向对象的方法。你可以在任何地方调用ax.tick_参数(axis='x',rotation=70)。@TEDPROU这里的“混合”是什么意思?
plt.setp
解决方案是完全面向对象的。如果您不喜欢其中包含一些
plt
,请使用matplotlib.artist import setp中的
;setp(ax.getxticklabels(),rotation=90)
。@ImportanceOfBeingErnest第一行代码使用
plt.xticks
,即pyplot。文档本身说不要混合样式
plt.setp
更详细,但也不是典型的面向对象风格。你的答案在这里绝对是最好的。基本上,任何带有函数的东西都不是面向对象的。不管您是否导入
setp
,问题的大部分代码都使用pyplot,比如
yticks
,除了
avail\u plot
之外,代码中根本没有定义ax。创建一个在x轴上有日期的绘图是一项非常常见的任务-遗憾的是没有更多完整的示例。我想知道这是否是一个伟大答案的重复!谢谢您能通过此函数控制“旋转模式”参数吗?@TheoryX否。如果您需要旋转模式,您需要使用
plt.setp
方法,或循环标记(基本相同)。是的,只有当x轴出现在图表底部时,这才是一个简单的解决方案。但是,当x轴位于图表顶部或存在两个x轴(
twinx
)时,会扭曲记号和记号标签之间的对齐。在这种情况下,特德·佩特罗的解决方案更好。@ubham是正确的。这主要是针对最常见情况的所有其他解决方案的快捷方式。这在matplotlib v1.5.1上对我有效(我在工作中被困在matplotlib的旧版本上,不要问为什么),我刚刚使用python3.6和matplotlib v2.2.2进行了测试,它也有效。是否可以更改所有绘图的默认旋转?我想我需要在我做的每一个图上改变这个。似乎是这里最OOP的方法。
ax.set_xticklabels(label_list, rotation=45)