我正在学习使用matplotlib和pandas,我遇到了一点麻烦。有一个数据框,分别有区和咖啡店作为y和x标签。列值表示各区咖啡店的开始日期
starbucks cafe-cool barista ........ 60 shops
dist1 2008-09-18 2010-05-04 2007-02-21 ...............
dist2 2007-06-12 2011-02-17
dist3
.
.
100 districts
我想绘制一个散点图,其中x轴为时间序列,y轴为咖啡店。由于我无法找到直接的一行方式来绘制这个,我将咖啡店作为一个列表提取并将日期作为其他列表。
shops = list(df.columns.values)
dt = pd.DataFrame(df.ix['dist1'])
dates = dt.set_index('dist1')
首先我尝试plt.plot(dates, shops)
。得到ZeroDivisionError:整数除法或模数为零 - 错误。我无法弄清楚它的原因。我在一些帖子上看到数据应该是数字的,所以我使用了ytick函数。
y = [1, 2, 3, 4, 5, 6,...60]
仍然plt.plot(dates, y)
抛出相同的ZeroDivisionError。如果我可以过去,这可能是我能够使用滴答功能绘图。资源 -
http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html
我试图仅绘制第一行/ dist1的图形。为此,我将第一行作为数据帧df1 = df.ix[1]
获取,然后使用以下
for badges, dates in df.iteritems():
date = dates
ax.plot_date(date, yval)
# Record the number and label of the coffee shop
label_ticks.append(yval)
label_list.append(badges)
yval+=1
。
我在第ax.plot_date(date, yval)
行收到错误,说x和y应该具有相同的第一维。因为我为每个咖啡店一个一个地绘制dist1,所以x和y的长度总是一个? PS:date是datetime.date对象
答案 0 :(得分:1)
要实现此目的,您需要将日期转换为日期时间,请参阅here 一个例子。如上所述,您还需要将咖啡店转换成 一些编号系统然后相应地更改刻度标签。
这是一次尝试
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
from datetime import datetime
def get_datetime(string):
"Converts string '2008-05-04' to datetime"
return datetime.strptime(string, "%Y-%m-%d")
# Generate datarame
df = pd.DataFrame(dict(
starbucks=["2008-09-18", "2007-06-12"],
cafe_cool=["2010-05-04", "2011-02-17"],
barista=["2007-02-21"]),
index=["dist1", "dist2"])
ax = plt.subplot(111)
label_list = []
label_ticks = []
yval = 1 # numbering system
# Iterate through coffee shops
for coffee_shop, dates in df.iteritems():
# Convert strings into datetime list
datetimes = [get_datetime(date) for date in dates]
# Create list of yvals [yval, yval, ...] to plot against
yval_list = np.zeros(len(dates))+yval
ax.plot_date(datetimes, yval_list)
# Record the number and label of the coffee shop
label_ticks.append(yval)
label_list.append(coffee_shop)
yval+=1 # Change the number so they don't all sit at the same y position
# Now set the yticks appropriately
ax.set_yticks(label_ticks)
ax.set_yticklabels(label_list)
# Set the limits so we can see everything
ax.set_ylim(ax.get_ylim()[0]-1,
ax.get_ylim()[1]+1)