Matplotlib 为三列绘制带有连接点的散点图,并在每个轴上复制值

Matplotlib 为三列绘制带有连接点的散点图,并在每个轴上复制值,matplotlib,plot,statistics,gnuplot,Matplotlib,Plot,Statistics,Gnuplot,我正试图用Ubuntu 15.10上的gnuplot 4.6绘制一个带有连接点的散点图。 My.dat文件如下所示: X Y ? 63072000 33 New York 64022400 12 Sacramento 64022400 21 Seattle 315532800 33 Boston 639964800

我正试图用Ubuntu 15.10上的gnuplot 4.6绘制一个带有连接点的散点图。
My.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->下雨状况,等等,第二个数字表示严重性)。十、 以及Y可以多次出现。 颜色(或形状)或圆点应指示我标记的位置?在上面 最后,图表应该显示日期、事件以及趋势(通过连接点)

我尝试了以下方法,从中我发现:

但X范围似乎是无效的。有人看到错误了吗/

还有一件事:不管是gnuplot还是matplotlib,这都无关紧要——我很感谢任何方面的提示:)

谢谢

编辑

多亏了阿玛蒂塔,剧情现在几乎完成了:

您提供的链接带来了一张世界地图。我在这里展示的示例中,只有带有连接线的标记(因此它们不是地理本地化的)。在任何情况下,使用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()
这将产生如下图像:

请注意,我正在更改标记的大小、标记本身、颜色、向每个点添加文本,最后提示一个图例

如果你想画一张考虑真实位置的地图,你可能想看看

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

    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()
,将产生以下结果:


注意:我必须说这是一个非常奇怪的情节。直觉上,在我看来,趋势应该针对每个城市,而不是城市之间(你应该为每个城市画一条线,尽管你似乎没有数据来绘制这样的图)。在任何情况下,这都是满足您要求的代码。

您提供的链接带来了一张世界地图。我在这里展示的示例中,只有带有连接线的标记(因此它们不是地理本地化的)。在任何情况下,使用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()
这将产生如下图像:

请注意,我正在更改标记的大小、标记本身、颜色、向每个点添加文本,最后提示一个图例

如果你想画一张考虑真实位置的地图,你可能想看看

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

    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()
,将产生以下结果:


注意:我必须说这是一个非常奇怪的情节。直觉上,在我看来,趋势应该针对每个城市,而不是城市之间(你应该为每个城市画一条线,尽管你似乎没有数据来绘制这样的图)。在任何情况下,这都是执行您请求的代码。

有几处更正:

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

set datafile separator "\t"
否则,“大雨”“纽约”和“大雨”“纽约”之间就会模棱两可

其次,必须说明时间格式:

set xdata time
set timefmt "%d.%m.%Y"
第三,没有数字数据值,只有
标签
,还有一个
调色板
,颜色取决于值,因此可能有一些有趣的选项可以尝试:

plot ... with labels palette

有几处更正:

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

set datafile separator "\t"
否则,“大雨”“纽约”和“大雨”“纽约”之间就会模棱两可

其次,必须说明时间格式:

set xdata time
set timefmt "%d.%m.%Y"
第三,没有数字数据值,只有
标签
,还有一个
调色板
,颜色取决于值,因此可能有一些有趣的选项可以尝试:

plot ... with labels palette

非常感谢您的回答:实际上我更喜欢matplotlib,但出于某种原因被推荐使用gnuplot。我很感激你的代码,但我认为这是一个误解:我希望时间在X轴上,天气在Y轴上。我还在示例数据中添加了一行(城市也可能出现多次)。所以我想说:“哪个城市的天气是什么时候出现的”,然后看看趋势以及它是如何随时间变化的。另外:非常感谢basemap提示:我以前不知道!当然Matplotlib可以直接处理日期,请查看以下示例:对于天气,您需要以某种方式将字符串转换为某种定量变量。例如,较小的值表示雨水较少,较大的值表示雨水较多,以便将其放置在Y轴上。一旦你决定了要怎么做,只需重写绘图中的标签。对于这个检查:哇,你回答得很快-我跟不上我的问题;)因此,我按照您的建议做了一些更改:首先:日期现在是一个不带分隔符的字符串(UNIX时间戳),因此X轴包含递增的数字。第二,正如你善意的建议,我现在有了每种天气条件的数字(组):小雨(31),雨(32),大雨(33),我在情节周围的文本中解释了这一点。我还更新了最初的问题!请你更新一下你的答案好吗?然后我可以接受它是正确的。谢谢你的帮助:)我已经编辑了答案,尽管我必须说这是一个非常奇怪的情节。就我个人而言,我建议您获取更多数据,并为每个城市制作一条线路。使用不同地点进行趋势分析(考虑到我们正在谈论的是天气)至少是不常见的(从科学的角度来看是有争议的)。@herMan代码提供了您所需要的一切,以满足您的要求。它有定位记号的方法(ax.set_-yticks([10,20,30],minor=False)),在记号上写任何你想写的东西的方法(ax.set_-yticklabels(['Sunny'、'More or Less'、'Rainy']),并处理散布函数上的颜色和标记。我相信你只需要几分钟就能解决这个问题