python 画图 横坐标为时间轴时如何手动控制时间

拙者 2014-02-10 09:57:59


当x轴为时间轴y轴为数据时,时间轴过密就会看不清时间如图1,如何才能控制时间标签不过密
...全文
20842 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
guohua414 2014-07-09
  • 打赏
  • 举报
回复
引人 matplotlib.dates 中的DayLocator,HourLocator,DateFormatter 可以通过如下设置: ax.xaxis.set_major_formatter( DateFormatter('%Y-%m-%d') )//X轴坐标的格式 ax.xaxis.set_major_locator(DayLocator())// 以天为单位分隔,可以改成自己想要的方式,譬如以月分隔,以年分隔 这样时间轴就不会过密。 matplotlib里面有plot_date可以处理X轴为时间日期的画图处理 不用自己通过plot来实现
拙者 2014-02-11
  • 打赏
  • 举报
回复
引用 11 楼 libralibra 的回复:
这个跟matlab完全一样,你修改了ticklabels,也就是x轴显示的文字标签 但是具体要显示多少个标签,取决于xtick,而不是ticklabels,跑一下下面的代码,然后根据你的需求改一下就行
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.grid(True)
plt.xticks(range(min(x),max(x)+1,3))
plt.show()
标签是数字的好设,还没查到标签是日期时间时,间隔应该怎么设?比方说每30天一个标签
libralibra 2014-02-11
  • 打赏
  • 举报
回复
引用 12 楼 whw1874 的回复:
[quote=引用 11 楼 libralibra 的回复:]
这个跟matlab完全一样,你修改了ticklabels,也就是x轴显示的文字标签
但是具体要显示多少个标签,取决于xtick,而不是ticklabels,跑一下下面的代码,然后根据你的需求改一下就行
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.grid(True)
plt.xticks(range(min(x),max(x)+1,3))
plt.show()

标签是数字的好设,还没查到标签是日期时间时,间隔应该怎么设?比方说每30天一个标签[/quote]
楼主可能没有用过matlab,tick和ticklabel是不一样的,只要保证他们2个长度相同就行.
tick决定的在哪里显示,ticklabel决定显示什么文字,这些都是可以自己设置的.
至于ticklabel是什么格式根本无所谓,因为最后要显示必须都转换为str,你可以自己设置格式的.
看下面的详细例子和图就明白了
import matplotlib.pyplot as plt

# data
x = [0,5,9,10,15]
y = [0,1,2,3,4]

# trick to get the axes
fig,ax = plt.subplots()

# make ticks and tick labels
xticks = range(min(x),max(x)+1,3)
xticklabels = ['2000-01-0'+str(n) for n in range(1,len(xticks)+1)]

# plot data
ax.plot(x,y)

# set ticks and tick labels
ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels,rotation=15)

# show the figure
plt.show()


拙者 2014-02-10
  • 打赏
  • 举报
回复
有调节,能控制时间范围,但是时间范围太大就会出现图1那种情况
ImN1 2014-02-10
  • 打赏
  • 举报
回复
你用的或图模块肯定有调节的
libralibra 2014-02-10
  • 打赏
  • 举报
回复
这个跟matlab完全一样,你修改了ticklabels,也就是x轴显示的文字标签 但是具体要显示多少个标签,取决于xtick,而不是ticklabels,跑一下下面的代码,然后根据你的需求改一下就行
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.grid(True)
plt.xticks(range(min(x),max(x)+1,3))
plt.show()
拙者 2014-02-10
  • 打赏
  • 举报
回复
这是画图的函数

def draw_m(datas,fname,t):
    figure(figsize=(9,5))
    ax = gca()
    xss=[]
    yss=[]
    
    #开始画线
    c = 0
    for dm,deep_name,xs,ys in datas[::-1]:

        xss = xss+xs
        yss = yss+ys
        print deep_name
        
        ax.plot_date(xs,ys,colors[c],linewidth=1.3,label=u'%s'%deep_name, linestyle='-')
##        #虚线显示
##        if dm < 1.6 :
##            ax.plot_date(xs,ys,colors[c],linestyle='--',linewidth=2,label='%s'%deep_name)
##        #实线显示 
##        else:
##            ax.plot_date(xs,ys,colors[c],linewidth=2,label='%s'%deep_name)
        c += 1

        
    #改变x,y轴刻度字体大小
    for label in ax.xaxis.get_ticklabels():
        label.set_fontsize(10)
    for label in ax.yaxis.get_ticklabels():
        label.set_fontsize(10)
    #设置x轴刻度显示时间格式
    ax.xaxis.set_major_formatter(mdate.DateFormatter('%y-%m-%d')) #x轴上的label格式为"年-月-日",其中年取后两位
    
    xlabels = ax.get_xticklabels()
    for xl in xlabels:
        xl.set_rotation(15) #把x轴上的label旋转15度,以免太密集时有重叠
    

    xstr = xlabel(u'日期(年-月-日)')
    ystr = ylabel(u'变形(mm)')

    #设置标题
    xss.sort()
    endtime = xss[len(xss)-1]
    jiesu =str(endtime)
    a=jiesu[:10]
    b=str(xss[0])[:10]
    title_name=t+u'(%s 至 %s)'%(b,a)
    tstr = title(title_name)
    
    grid(True)#显示网格
    #设置x轴、y轴、标题的属性
    setp(xstr,size=12,color='b')
    setp(ystr,size=12,color='b')
    setp(tstr,size=16,color='b')
##    setp(ystr,size=30,color='b')
##    setp(tstr,size=30,color='b')
    
    start_date = xss[0]
    end_date = endtime+timedelta(days=5)
    
##    if start_date>start_date1:
##       start_date= start_date1
##    xlim(start_date,end_date)
        

    yss.sort()
    #如果数据的最大值还小于3mm刻度范围设为-1~5
    if yss[len(yss)-1] <3:
        ylim(-1,5)
        
    
    legend(loc='upper left',prop={'size':12})
    savefig(fname,dpi=120)
    clf()
拙者 2014-02-10
  • 打赏
  • 举报
回复
引用 8 楼 angel_su 的回复:
如何设置看文档吧,说说你用啥模块绘图?
我用的matplotlib模块
angel_su 2014-02-10
  • 打赏
  • 举报
回复
如何设置看文档吧,说说你用啥模块绘图?
拙者 2014-02-10
  • 打赏
  • 举报
回复
引用 5 楼 snmr_com 的回复:
[quote=引用 3 楼 angel_su 的回复:] 和范围多大没啥关系吧,貌似下图格线14天,但是上图也就多一个月格线反倒变得很小,这样说明是你自己没设定好来...
我猜他的意思是想画很多个节点,但坐标只显示关键的节点 例如画100个点,但坐标只显示0、10、20、30…… 应该他用的作图模块能控制的[/quote] 我要图1也像图2一样显示,不需要显示那么多时间
拙者 2014-02-10
  • 打赏
  • 举报
回复
我的意思是只显示上面的图能不能也像下边的图一样,为什么有的图时间范围一样,画出来有的很密有像图1有的像图2
ImN1 2014-02-10
  • 打赏
  • 举报
回复
引用 3 楼 angel_su 的回复:
和范围多大没啥关系吧,貌似下图格线14天,但是上图也就多一个月格线反倒变得很小,这样说明是你自己没设定好来...
我猜他的意思是想画很多个节点,但坐标只显示关键的节点 例如画100个点,但坐标只显示0、10、20、30…… 应该他用的作图模块能控制的
CDSoftwareWj 2014-02-10
  • 打赏
  • 举报
回复
考虑一下,把时间点信息换成空 嘿嘿 ......时间........时间......
angel_su 2014-02-10
  • 打赏
  • 举报
回复
和范围多大没啥关系吧,貌似下图格线14天,但是上图也就多一个月格线反倒变得很小,这样说明是你自己没设定好来...

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧