首先,如果我没有正确描述问题,我很抱歉,但这个例子应该让我的问题清楚。
我有这个数据框,我需要按日期绘制它,但我有很多日期(大约60),因此大熊猫自动选择在x轴上绘制(标签)的日期,日期是随机的。由于可见性问题,我也想只在x轴上绘制选定的日期,但我希望它每年都有一些模式,如1月。
这是我的代码:
df = pd.read_csv('dbo.Access_Stat_all.csv',error_bad_lines=False, usecols=['Range_Start','Format','Resource_ID','Number'])
df1 = df[df['Resource_ID'] == 32543]
df1 = df1[['Format','Range_Start','Number']]
df1["Range_Start"] = df1["Range_Start"].str[:7]
df1 = df1.groupby(['Format','Range_Start'], as_index=True).last()
pd.options.display.float_format = '{:,.0f}'.format
df1 = df1.unstack()
df1.columns = df1.columns.droplevel()
if df1.index.contains('entry'):
df2 = df1[1:4].sum(axis=0)
else:
df2 = df1[0:3].sum(axis=0)
df2.name = 'sum'
df2 = df1.append(df2)
print(df2)
df2.to_csv('test.csv', sep="\t", float_format='%.f')
if df2.index.contains('entry'):
df2.T[['entry','sum']].plot(rot = 30)
else:
df2.T[['sum']].plot(kind = 'bar')
ax1 = plt.axes()
ax1.legend(["Seitenzugriffe", "Dateiabrufe"])
plt.xlabel("")
plt.savefig('image.png')
正如您所看到的情节,将2010-08,2013-09,2014-07作为x轴值。我该如何制作类似2010-01,2013-01,2014-01 e.t.c
的内容非常感谢,我知道这不是最佳描述,但由于英语不是我的第一语言,这是我能想到的最好的语言。
答案 0 :(得分:1)
注意:已更新以更直接地回答OP问题。
您正在使用matplotlib
(axes
以及ax1
方法和plt
混合Pandas绘图以及matplotlib
PyPlot API和Object-oriented API方法。后者是两种截然不同的API,它们在混合时可能无法正常工作。 matplotlib.pyplot
文档建议使用面向对象的API。
虽然使用
matplotlib.axes.Axes()
模块快速生成绘图很容易,但我们建议使用面向对象的方法来更好地控制和自定义绘图。有关许多相同的绘图函数,请参阅matplotlib
类中的方法。有关Matplotlib的OO方法的示例,请参阅API示例。
以下是使用面向对象的API使用正确的matplotlib
日期格式(see matplotlib
example)控制x轴“tick”值/标签的方法。另请参阅@ImportanceOfBeingErnest answer to another question中的链接,了解Pandas和datetime
# prepare your data
df = pd.read_csv('../../../so/dbo.Access_Stat_all.csv',error_bad_lines=False, usecols=['Range_Start','Format','Resource_ID','Number'])
df.head()
df1 = df[df['Resource_ID'] == 10021]
df1 = df1[['Format','Range_Start','Number']]
df1["Range_Start"] = df1["Range_Start"].str[:7]
df1 = df1.groupby(['Format','Range_Start'], as_index=True).last()
pd.options.display.float_format = '{:,.0f}'.format
df1 = df1.unstack()
df1.columns = df1.columns.droplevel()
if df1.index.contains('entry'):
df2 = df1[1:4].sum(axis=0)
else:
df2 = df1[0:3].sum(axis=0)
df2.name = 'sum'
df2 = df1.append(df2)
print(df2)
df2.to_csv('test.csv', sep="\t", float_format='%.f')
if df2.index.contains('entry'):
# convert your index to use pandas datetime format
df3 = df2.T[['entry','sum']].copy()
df3.index = pd.to_datetime(df3.index)
# for illustration, I changed a couple dates and added some dummy values
df3.loc['2014-01-01']['entry'] = 48
df3.loc['2014-05-01']['entry'] = 28
df3.loc['2015-05-01']['entry'] = 36
print(df3)
# plot your data
fig, ax = plt.subplots()
# use matplotlib date formatters
years = mdates.YearLocator() # every year
yearsFmt = mdates.DateFormatter('%Y-%m')
# format the major ticks
ax.xaxis.set_major_locator(years)
ax.xaxis.set_major_formatter(yearsFmt)
ax.plot(df3)
# add legend
ax.legend(["Seitenzugriffe", "Dateiabrufe"])
fig.savefig('image.png')
else:
# left as an exercise...
df2.T[['sum']].plot(kind = 'bar')
个对象之间的不兼容性。
class rectangle : shape
{
public int length { get; set; }
public int width { get; set; }
public override void Draw(Graphics g)
{
g.DrawRectangle(new Pen(color), new Rectangle(startx, starty, width,length));
}
}