非数字数据的散点图

时间:2014-08-04 07:32:39

标签: python matplotlib dataframe

我正在学习使用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对象

1 个答案:

答案 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)