用同一时间轴绘制两个子图的垂直线

2024-10-01 07:45:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我是编程新手,我已经尝试了几天用不同的函数来绘制两条垂直线,它们横跨两个子图,它们共享时间x轴,但y轴完全不同,但要么这两条线没有出现在绘图上,要么整个绘图都变空了。 这些线应该代表雷暴的开始和结束,所以它们应该位于特定的时间,在这种情况下是16:00和20:30。我不得不在另外三场雷雨中重复这一点,但我连一次都做不好。 我的密码是:

ce28 = pd.read_csv('Data Source 1-06282017.efm', header=None, 
parse_dates=True)
col=ce28[1]
cuentas = 120
promedios = [sum(col[i:i+cuentas])//cuentas for i in range(0,len(col),cuentas)]

proms=promedios[924:]
print(len(proms))

from datetime import datetime
from datetime import timedelta

inicio = datetime(2017,6,28,14,0,0)
fin = datetime(2017,6,28,23,0,0)

seconds = (fin - inicio).total_seconds()
delta = timedelta(minutes=1)

tiempo = []
for i in range(0, int(seconds), int(delta.total_seconds())):
tiempo.append(inicio + timedelta(seconds=i))

print(len(tiempo))

datos= pd.read_csv('28-6-2017_28-6-2017_min.txt', sep='\t', header=None, 
parse_dates=True)
col1=datos[2]
col11=col1[900:]
print(len(col11))

fig1 = plt.figure(figsize=(25,8))
gs = gridspec.GridSpec(2, 1) 

ax0 = plt.subplot(gs[0])
graf0 = ax0.plot(tiempo, proms,color='b')
plt.ylabel('Intensidad de E (kV/m)',fontweight='bold')
plt.grid(True)
ax1 = plt.subplot(gs[1], sharex = ax0)
graf1 = ax1.plot(tiempo, col11, color='b')
plt.xlabel('Tiempo Local',fontweight='bold')
plt.ylabel('Cuentas por minuto',fontweight='bold')
plt.grid(True)
ax1.xaxis.set_major_locator(md.MinuteLocator(byminute=[0,15,30,45],interval=1))
ax1.xaxis.set_major_formatter(md.DateFormatter('%H:%M')) 
plt.ylim(1300,1450)
plt.setp(ax0.get_xticklabels(), visible=False)
plt.subplots_adjust(hspace=.0)
plt.margins(x=0)
plt.show()

这张图很漂亮: beauty

我想达到的效果是这样的,我用power point画了线,很明显质量不一样: desired

如果您能给我任何帮助,我们将不胜感激!谢谢您。在

数据:https://www.dropbox.com/sh/cjolnsns37r8sby/AAAiijE3DWR1yR0G1qys7g47a?dl=0


Tags: truedatetimelenpltcoltimedeltasecondsprint
3条回答

像那样的东西应该可以做到

f = plt.figure()
ax1 = f.add_subplot(211)
ax2 = f.add_subplot(212)

rect = patches.Rectangle((10,2),3,1,linewidth=1,edgecolor='r',facecolor='none')

f.patches.extend([patches.Polygon([(0.4,0.1),(0.4,1.5)],
                                  fill=True, color='g', alpha=0.5, zorder=1000,
                                  transform=ax2.transData,
                                  figure=f)])

请注意,线路(普立万)的坐标指的是ax2的数据空间。在

{a1}

{cd1>主要的变化包括。我还在上面的图中为y轴添加了限制。x轴的记号标签一团糟。我希望那是因为我编造了数据,没有花时间把它们正确地计算出来。我的主要目的是建议一种获得垂直线的方法。在

主要思想是,由于tiempo是以日期时间为单位的,所以要绘制垂直线,它们的x坐标也必须是日期时间单位;因此,计算和使用red_ordinates的方法。在

from matplotlib import pyplot as plt
from matplotlib import gridspec
import matplotlib.dates as md
import numpy as np
import random

tiempo = np.arange(771).astype('<i8').view('M8[m]').tolist()
proms = [random.gauss(0,1) for _ in range(len(tiempo))]
col11 = [1380+5*random.gauss(0,1) for _ in range(len(tiempo))]

red_ordinates = np.linspace(10,50,2).astype('<i8').view('M8[m]').tolist()

fig1 = plt.figure(figsize=(25,8))
gs = gridspec.GridSpec(2, 1) 

ax0 = plt.subplot(gs[0])
graf0 = ax0.plot(tiempo, proms,color='b')

ax0.plot([red_ordinates[0], red_ordinates[0]], [-3.5, 3.5], color='r')
ax0.plot([red_ordinates[1], red_ordinates[1]], [-3.5, 3.5], color='r')

plt.ylim(-3.5, 3.5)
plt.ylabel('Intensidad de E (kV/m)',fontweight='bold')
plt.grid(True)
ax1 = plt.subplot(gs[1], sharex = ax0)
graf1 = ax1.plot(tiempo, col11, color='b')

ax1.plot([red_ordinates[0], red_ordinates[0]], [1300, 1450], color='r')
ax1.plot([red_ordinates[1], red_ordinates[1]], [1300, 1450], color='r')

plt.xlabel('Tiempo Local',fontweight='bold')
plt.ylabel('Cuentas por minuto',fontweight='bold')
plt.grid(True)
ax1.xaxis.set_major_locator(md.MinuteLocator(byminute=[0,15,30,45],interval=1))
ax1.xaxis.set_major_formatter(md.DateFormatter('%H:%M')) 
plt.ylim(1300,1450)
plt.setp(ax0.get_xticklabels(), visible=False)
plt.subplots_adjust(hspace=.0)
plt.margins(x=0)
plt.show()

结果图:

{a1}

这就是我最终成功的原因:

ax0.axvline(pd.to_datetime('2017-06-28-00:00:00'), color='k', linestyle='-.')

相关问题 更多 >