【问题标题】:Plot a scatter Plot with connected points for three columns and duplicate values per axis绘制一个散点图,其中三列的连接点和每个轴的重复值
【发布时间】:2016-06-30 19:25:55
【问题描述】:

我正在尝试在 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,情节现在差不多完成了:

【问题讨论】:

    标签: matplotlib plot statistics gnuplot


    【解决方案1】:

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

    这会给出这样的图像:

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

    如果你想绘制一张考虑真实位置的地图,你可能想看看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()
    

    ,会产生如下结果:

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

    【讨论】:

    • 非常感谢您的回答:我实际上更喜欢 matplotlib,但由于某种原因被推荐使用 gnuplot。我很欣赏你的代码,但我认为有一个误解:我想把时间放在 X 轴上,把天气放在 Y 轴上。我还在样本数据中添加了一行(城市也可以出现多次)。所以我想说:“哪些城市出现了天气什么时候”,然后看看趋势以及它是如何随时间变化的。另外:非常感谢底图提示:以前不知道!
    • 当然。 Matplotlib 可以直接处理日期,请查看以下示例:matplotlib.org/examples/pylab_examples/date_demo1.html 至于天气,您需要以某种方式将您拥有的字符串转换为某种定量变量。例如,较低的值表示较少的降雨,较高的值表示较多的降雨,以便将它们放在 Y 轴上。一旦你决定了你想怎么做,只需重写图中的标签。对于此检查:matplotlib.org/examples/ticks_and_spines/…
    • 哇,你回答得很快——我跟不上我的问题;)所以,我按照你的建议做了一些改变:首先:日期现在是一个非分隔字符串(UNIX 时间戳),因此 X 轴包含递增数字。其次,正如您所建议的那样,我现在有每种天气条件的数字(组):小雨(31)、雨(32)、大雨(33),我在情节周围的文字中解释了这些。我还更新了最初的问题!你会这么好心并更新你的答案吗?然后我可以接受它作为正确的。感谢您的帮助:)
    • 我已经编辑了答案,尽管我必须说这是一个非常奇怪的情节。我个人建议您获取更多数据并为每个城市做一条线。使用不同位置的趋势分析(并考虑到我们所说的天气)至少是不常见的(从科学的角度来看是有争议的)。
    • @herMan 代码包含了执行您所要求的一切所需的一切。它具有定位刻度的方法(ax.set_yticks([10,20,30],minor=False)),在刻度上写任何你想要的方法(ax.set_yticklabels(['Sunny','More or Less' ,'Rainy'])),并处理散射函数上的颜色和标记。我相信您只需几分钟就可以解决这些明显的问题并适应您需要适应的一切。
    【解决方案2】:

    有几个更正:

    首先,列分隔符似乎是一个表格,所以你可以这样写:

    set datafile separator "\t"
    

    否则,“Heavy Rain”“New York”和“Heavy”“Rain New York”之间会有歧义

    第二,必须说明时间格式:

    set xdata time
    set timefmt "%d.%m.%Y"
    

    第三,除了labels 和palette 的颜色之外没有数字数据值,具体取决于值,因此可能有一些有趣的选项可以尝试:

    plot ... with labels palette
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2021-04-25
      相关资源
      最近更新 更多