绘制散点图,其中连接点为三列,每个轴重复值

时间:2016-03-15 11:22:30

标签: matplotlib plot statistics gnuplot

我正在尝试使用Ubuntu 15.10上的gnuplot 4.6绘制带有连接点的散点图。
我的.dat文件如下所示:

    X           Y           ?
63072000        33          New York
64022400        12          Sacramento
64022400        21          Seattle
315532800       33          Boston
639964800       21          San Francisco
706320000       33          Seattle

因此,X轴包含日期,Y轴包含事件,其中数字表示组中的天气状况(10 - >晴天条件,30 - >雨天条件,等等,第二个数字描述严重性)。 X,以及Y可以多次出现。 颜色(或形状)或点应指明我标记的位置?以上。 最终,图表应显示日期,事件以及趋势(通过连接点)。

我尝试了以下内容,我在此SO post中找到了:

plot "weather.dat" u 1:2:3 with lines

但X范围似乎无效。有人看到错误吗? :/

还有一件事:没关系,如果gnuplot或matplotlib-我感谢任何方向的暗示:)

谢谢!

修改

感谢armatita,情节现在差不多完成了: Semi-Final Plot

2 个答案:

答案 0 :(得分:3)

您提供的链接带来了世界地图。我在这里显示的示例只有带有连接它们的线的标记(因此它们不是地理定位的)。在任何情况下使用matplotlib(不了解GNUplot),您可以调整以下配方:

    import random
    import matplotlib.pyplot as plt

    x = ['01.01.1960','12.01.1960','12.01.1960','01.01.1970','13.04.1980']
    y = ['Heavy Rain','Sunshine','Slight Hail','Heavy Rain','Slight Hail']
    l = ['New York','Sacramento','Seattle','Boston','San Francisco']

    nx,ny = [],[]
    for i in range(len(x)):
        nx.append(i)
        ny.append(-i)
        s = random.randint(100,150)
        m = random.choice(['o','s','^','d'])
        color = random.randint(0,255)/255,random.randint(0,255)/255,random.randint(0,255)/255
        plt.scatter(i,-i,s=s,marker=m,color=color,label=y[i])
        plt.text(i,-i,x[i])
    plt.plot(nx,ny,'--')
    plt.legend()
    plt.show()

这将提供如下图像:Markers with line connecting them

注意我改变标记的大小,标记本身,颜色,向每个点添加文本,最后提示图例。

如果您想根据实际位置绘制地图,可能需要查看Basemap

编辑(海报清除后的意图): 以下代码:

    xt = [63072000,64022400,64022400,315532800,639964800,706320000]
    y2 = [33,12,21,33,21,33]
    l  = ['New York','Sacramento','Seattle','Boston','San Francisco','Seattle']
    lm  = ['o','s','^','d','*','^']
    cl  = ['red','blue','green','orange','purple','green']

    import matplotlib.pyplot as plt
    from matplotlib.dates import YearLocator, MonthLocator, DateFormatter,AutoDateLocator
    import datetime

    # get the dates into something readable
    x2 = [datetime.datetime.fromtimestamp(i) for i in xt]
    years = YearLocator()   # every year
    months = MonthLocator()  # every month
    yearsFmt = DateFormatter('%Y')
    auto = AutoDateLocator()

    # plot lines and markers
    fig, ax = plt.subplots()
    ax.plot_date(x2, y2, '--',color='black')
    for i in range(len(x2)):
        ax.scatter(x2[i],y2[i],s=300,marker=lm[i],color=cl[i])
        plt.text(x2[i],y2[i],l[i])

    # format the ticks
    ax.xaxis.set_major_locator(auto)
    ax.xaxis.set_major_formatter(yearsFmt)
    ax.xaxis.set_minor_locator(months)
    ax.autoscale_view()

    ax.set_yticks([10,20,30], minor=False)
    ax.set_yticklabels(['Sunny','More or Less','Rainy'])
    #ax.yticks([10,20,30], ['Sunny','More or Less','Rainy'], rotation='vertical')

    ax.fmt_xdata = DateFormatter('%Y-%m-%d')
    ax.grid(True)

    fig.autofmt_xdate()

    plt.show()

,将产生以下结果:

enter image description here

注意:我必须说这是一个非常奇怪的情节。直观地,在我看来,每个城市的趋势应该是,而不是城市之间(每个城市应该有一条线,尽管你似乎没有数据来做这样的情节)。无论如何,这是满足您要求的代码。

答案 1 :(得分:0)

有几处更正:

首先,列分隔符似乎是一个制表符,因此您可以写:

    ...
    axes = plt.gca()
    axes.lines = []
    ...

否则,“暴雨”“纽约”和“重型”“雨纽约”之间会有歧义

其次,必须描述时间格式:

set datafile separator "\t"

第三,没有数字数据值,但set xdata time set timefmt "%d.%m.%Y" labels颜色取决于值,因此可能会尝试一些有趣的选项:

palette