我有一个简单的堆叠线图,它具有我想要使用以下代码时神奇地设置的日期格式.
df_ts = df.resample("W", how='max')
df_ts.plot(figsize=(12,8), stacked=True)
Run Code Online (Sandbox Code Playgroud)

然而,当绘制与条形图相同的数据时,日期神秘地将自身转换为丑陋且不可读的格式.
df_ts = df.resample("W", how='max')
df_ts.plot(kind='bar', figsize=(12,8), stacked=True)
Run Code Online (Sandbox Code Playgroud)

原始数据进行了一些转换,以获得每周最大值.为什么自动设定日期发生了根本变化?我怎样才能拥有如上所述的格式良好的日期?
这是一些虚拟数据
start = pd.to_datetime("1-1-2012")
idx = pd.date_range(start, periods= 365).tolist()
df=pd.DataFrame({'A':np.random.random(365), 'B':np.random.random(365)})
df.index = idx
df_ts = df.resample('W', how= 'max')
df_ts.plot(kind='bar', stacked=True)
Run Code Online (Sandbox Code Playgroud) 考虑这个简单的例子
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import matplotlib.dates as mdates
pd.__version__
Out[147]: u'0.22.0'
idx = pd.date_range('2017-01-01 05:03', '2017-01-01 18:03', freq = 'min')
df = pd.Series(np.random.randn(len(idx)), index = idx)
df.head()
Out[145]:
2017-01-01 05:03:00 0.4361
2017-01-01 05:04:00 0.9737
2017-01-01 05:05:00 0.8430
2017-01-01 05:06:00 0.4292
2017-01-01 05:07:00 0.5739
Freq: T, dtype: float64
Run Code Online (Sandbox Code Playgroud)
我想绘制这个,并且每小时都有刻度.我用:
fig, ax = plt.subplots()
hours = mdates.HourLocator(interval = 1) #
h_fmt = mdates.DateFormatter('%H:%M:%S')
df.plot(ax = ax, color = 'black', …Run Code Online (Sandbox Code Playgroud) 我有一个这样的数据框:
data_ = list(range(106))
index_ = pd.period_range('3/1/2004', '12/1/2012', freq='M')
df2_ = pd.DataFrame(data = data_, index = index_, columns = ['data'])
Run Code Online (Sandbox Code Playgroud)
我想绘制这个数据框。目前,我正在使用:
df2_.plot()
Run Code Online (Sandbox Code Playgroud)
现在我喜欢控制 x 轴上的标签(可能还有刻度)。特别是,我喜欢在轴上有每月的刻度,并且可能每隔一个月或每季度有一个标签。我也喜欢有垂直的网格线。
我开始研究这个例子,但我已经无法构建 timedelta。
我有一个带有 datetimeIndex 的数据帧和两列带有 int 值的数据帧。我想在同一个图上绘制 Col1 作为条形图,将 Col2 作为线图。
重要的功能是在放大时将 x 轴正确标记为日期时间。我认为使用 DateFormatter 的解决方案不起作用,因为我想要动态 xtick 标签。
import matplotlib.pyplot as plt
import pandas as pd
import datetime as dt
import numpy as np
startDate = dt.datetime(2018,1,1,0,0)
nrHours = 144
datetimeIndex = [startDate + dt.timedelta(hours=x) for x in range(0,nrHours)]
dF = pd.DataFrame(index=datetimeIndex)
dF['Col1'] = np.random.randint(1,3,nrHours)
dF['Col2'] = np.random.randint(3,6,nrHours)
axes = dF[['Col1']].plot(kind='bar')
dF[['Col2']].plot(ax=axes)
Run Code Online (Sandbox Code Playgroud)
看似简单的任务实际上非常具有挑战性。事实上,在网上进行了大量搜索后,我仍然没有找到任何干净的解决方案。
我尝试过使用 pandas 绘图和 matplotlib。主要问题来自条形图,它似乎难以处理日期时间索引(更喜欢整数,在某些情况下它会绘制日期,但采用 Epoch 1970-1-1 样式,相当于 0)。
我目前正在使用以下数据绘制时间散点图(您可以使用这些数据来重现我的绘图)。x 轴绘制的数据是时间,特别是datetime.datetime对象 ( tp_pass),而 y 轴绘制的数据是 -180 到 180 之间的角度 ( azip_pass)。而且,他们都是numpy.array。
tp_pass=np.array([datetime.datetime(2019, 10, 29, 1, 4, 43),
datetime.datetime(2019, 10, 31, 1, 11, 19),
datetime.datetime(2019, 11, 20, 8, 26, 7),
datetime.datetime(2019, 11, 20, 23, 50, 43),
datetime.datetime(2019, 12, 10, 17, 5, 2),
datetime.datetime(2020, 1, 2, 18, 23, 53),
datetime.datetime(2020, 2, 13, 10, 33, 44),
datetime.datetime(2020, 2, 20, 18, 57, 36),
datetime.datetime(2020, 3, 25, 2, 49, 20),
datetime.datetime(2020, 4, 10, 16, 44, 56),
datetime.datetime(2020, 4, …Run Code Online (Sandbox Code Playgroud) matplotlib ×5
pandas ×3
python ×3
plot ×2
bar-chart ×1
dataframe ×1
python-3.x ×1
time-series ×1