From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id YKcfFTK+z14jNwAA0tVLHw (envelope-from ) for ; Thu, 28 May 2020 13:35:46 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id 6OovETK+z17zYQAAB5/wlQ (envelope-from ) for ; Thu, 28 May 2020 13:35:46 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 864619401AE for ; Thu, 28 May 2020 13:35:44 +0000 (UTC) Received: from localhost ([::1]:32994 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jeIhB-00056q-SQ for larch@yhetil.org; Thu, 28 May 2020 09:35:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42980) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jeIgi-00055k-Tw for emacs-orgmode@gnu.org; Thu, 28 May 2020 09:35:12 -0400 Received: from latitanza.investici.org ([82.94.249.234]:63801) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jeIgg-0003kG-7v for emacs-orgmode@gnu.org; Thu, 28 May 2020 09:35:12 -0400 Received: from mx3.investici.org (unknown [127.0.0.1]) by latitanza.investici.org (Postfix) with ESMTP id 776F1120962; Thu, 28 May 2020 13:35:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=anche.no; s=stigmate; t=1590672906; bh=JFgoA6TCYdJ0RZRdUhtj3QpjNP9vdKzATjawmp/BOys=; h=Subject:To:References:From:Cc:Date:In-Reply-To:From; b=d0vgks2mBzxpBVkDT5lgpCALHlTDqJtzEr5XmuPrRP2VYlIPFdRQTV2xTFG8faGvd xh3NwaOfI2gvyiKt0G9mMOrInsB+JLrgrUgFMXEWvL0lZJaXbZPweNeXwe6O8q5KiK zgCRXxcY0WoUoKHCy/BxrNoFdc7BrAEJrqjvbxdc= Received: from [82.94.249.234] (mx3.investici.org [82.94.249.234]) (Authenticated sender: mariotomo@inventati.org) by localhost (Postfix) with ESMTPSA id 73A221201B4; Thu, 28 May 2020 13:35:03 +0000 (UTC) Subject: [PATCH] [FEATURE] Re: `with` as a list. To: emacs-orgmode@gnu.org References: <656b815f-9e38-e68c-b7a3-091f6f3d36bf@anche.no> From: Mario Frasca Message-ID: Date: Thu, 28 May 2020 08:34:57 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.1 MIME-Version: 1.0 In-Reply-To: <656b815f-9e38-e68c-b7a3-091f6f3d36bf@anche.no> Content-Type: multipart/mixed; boundary="------------2F575CDF2CF2CEACADC12428" Content-Language: en-US Received-SPF: pass client-ip=82.94.249.234; envelope-from=mario@anche.no; helo=latitanza.investici.org X-detected-operating-system: by eggs.gnu.org: First seen = 2020/05/28 09:35:06 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: schulte.eric@gmail.com Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Scanner: scn0 Authentication-Results: aspmx1.migadu.com; dkim=fail (body hash did not verify) header.d=anche.no header.s=stigmate header.b=d0vgks2m; dmarc=none; spf=pass (aspmx1.migadu.com: domain of emacs-orgmode-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=emacs-orgmode-bounces@gnu.org X-Spam-Score: -0.01 X-TUID: lb+sMTTqhL4L This is a multi-part message in MIME format. --------------2F575CDF2CF2CEACADC12428 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit I have added a couple of unit tests to the suite, describing the two functions I added.  I have no unexpectedly failing tests now. I'm explicitly cc-ing Eric Schulte because he's in the header for org-plot.el, and —missing the unit tests for that source— I hope he can assist me not breaking what he wrote.  … I guess I can write also test cases for what already exists, but I will very likely need assistance. best regards, Mario Frasca On 22/05/2020 11:07, Mario Frasca wrote: > good day to you all > > now and then I use emacs to make graphs.  now recently I was plotting > point data, and a running average "fit", so I wanted to have points, > and lines, which I know it's possible in `gnuplot` but now how do I do > that from org-plot … > > I wrote a small patch for org-plot.el, I'm not a Lisp programmer so > I'm sure the patch looks terrible, but it does allow me to do this: > > #+PLOT: ind:1 deps:(3 6 4 7) with:(points lines points lines) > > it's two additions: > > 1. it lets me specify the order in which the dependent columns should > be considered. > > 2. it lets me specify a different `with` for each column, in the same > order. > > if you leave the `with` away, you get "lines" for all columns. > > if you specify only one `with` value, that value is used for all columns. > > if you specify more `deps` than `with`, the ones not specified will > get "lines". > > if you specify more `with` than `deps`, they are ignored. > > I ran the tests, and I get two failing ones, quite unrelated according > to me: > > 2 unexpected results: >    FAILED  ob-exp/evaluate-all-executables-in-order >    FAILED  ob-exp/export-call-line-information > > I have not defined test cases for the new behaviour, I'm willing to do > that (learning the way this test environment works), but I don't find > the location of the other tests related to the area of the program, > which I'm tweaking. > > best regards all, > > Mario Frasca > --------------2F575CDF2CF2CEACADC12428 Content-Type: text/x-patch; charset=UTF-8; name="plot-with-list.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="plot-with-list.patch" diff --git a/lisp/org-plot.el b/lisp/org-plot.el index a23195d2a..524615d98 100644 --- a/lisp/org-plot.el +++ b/lisp/org-plot.el @@ -179,6 +179,28 @@ and dependent variables." (setf back-edge "") (setf front-edge "")))) row-vals)) +(defun org-plot/zip-deps-with (num-cols ind deps with) + "describe each column to be plotted as (col . with)" + ;; make 'deps explicit + (unless deps + (setf deps (let (r) + (dotimes (i num-cols r) + (unless (eq num-cols (+ ind i)) + (setq r (cons (- num-cols i) r))))))) + ;; make sure 'with matches 'deps + (unless with + (setf with "lines")) + (unless (listp with) + (setf with (make-list (length deps) with))) + ;; invoke zipping function on converted data + (org-plot/zip deps with)) + +(defun org-plot/zip (xs ys) + (unless + (null xs) + (cons (cons (car xs) (or (car ys) "lines")) + (org-plot/zip (cdr xs) (cdr ys))))) + (defun org-plot/gnuplot-script (data-file num-cols params &optional preface) "Write a gnuplot script to DATA-FILE respecting the options set in PARAMS. NUM-COLS controls the number of columns plotted in a 2-d plot. @@ -240,22 +262,24 @@ manner suitable for prepending to a user-specified script." "%Y-%m-%d-%H:%M:%S") "\""))) (unless preface (pcase type ; plot command - (`2d (dotimes (col num-cols) - (unless (and (eq type '2d) - (or (and ind (equal (1+ col) ind)) - (and deps (not (member (1+ col) deps))))) - (setf plot-lines - (cons - (format plot-str data-file - (or (and ind (> ind 0) - (not text-ind) - (format "%d:" ind)) "") - (1+ col) - (if text-ind (format ":xticlabel(%d)" ind) "") - with - (or (nth col col-labels) - (format "%d" (1+ col)))) - plot-lines))))) + (`2d (dolist + (col-with + (org-plot/zip-deps-with num-cols ind deps with)) + (setf plot-lines + (cons + (format plot-str data-file + (or (and ind (> ind 0) + (not text-ind) + (format "%d:" ind)) "") + (car col-with) + (if text-ind (format ":xticlabel(%d)" ind) "") + (cdr col-with) + (apply (lambda (x) + (if (= 0 (length x)) + (format "%d" (car col-with)) + x)) + (list (nth (1- (car col-with)) col-labels)))) + plot-lines)))) (`3d (setq plot-lines (list (format "'%s' matrix with %s title ''" data-file with)))) @@ -310,7 +334,8 @@ line directly before or after the table." table data-file params))) (when y-labels (plist-put params :ylabels y-labels))))) ;; Check for timestamp ind column. - (let ((ind (1- (plist-get params :ind)))) + (let ((ind (1- (plist-get params :ind))) + (with (plist-get params :with))) (when (and (>= ind 0) (eq '2d (plist-get params :plot-type))) (if (= (length (delq 0 (mapcar @@ -320,7 +345,7 @@ line directly before or after the table." 0) (plist-put params :timeind t) ;; Check for text ind column. - (if (or (string= (plist-get params :with) "hist") + (if (or (and (stringp with) (string= with "hist")) (> (length (delq 0 (mapcar (lambda (el) diff --git a/testing/lisp/test-org-plot.el b/testing/lisp/test-org-plot.el new file mode 100644 index 000000000..4ed8c15b4 --- /dev/null +++ b/testing/lisp/test-org-plot.el @@ -0,0 +1,62 @@ +;;; test-org-plot.el --- Tests for org-plot.el + +;; Copyright (C) 2020 Mario Frasca + +;; Author: Mario Frasca + +;; Released under the GNU General Public License version 3 +;; see: http://www.gnu.org/licenses/gpl-3.0.html + +;;;; Comments + + + +;;; Code: + +(require 'org-plot) + +(ert-deftest test-org-plot/zip () + "Test `org-plot/zip' specifications." + ;; zipping two equal length lists + (should + (equal '((1 . "a") (2 . "b") (3 . "c")) + (org-plot/zip '(1 2 3) '("a" "b" "c")))) + ;; if second is shorter, fill in with "lines" + (should + (equal '((1 . "a") (2 . "b") (3 . "lines")) + (org-plot/zip '(1 2 3) '("a" "b")))) + ;; if first is shorter, stop there + (should + (equal '((1 . "a") (2 . "b")) + (org-plot/zip '(1 2) '("a" "b" "c"))))) + +(ert-deftest test-org-plot/zip-deps-with () + "Test `org-plot/zip-deps-with' specifications." + ;; no deps, no with. defaults to all except ind, and "lines" + (should + (equal (org-plot/zip-deps-with 3 1 nil nil) + '((2 . "lines") (3 . "lines")))) + ;; no deps, single with. defaults to all except ind, and repeated with + (should + (equal (org-plot/zip-deps-with 3 1 nil "hist") + '((2 . "hist") (3 . "hist")))) + ;; no deps, explicit with + (should + (equal (org-plot/zip-deps-with 3 1 nil '("points" "hist")) + '((2 . "points") (3 . "hist")))) + ;; explicit with, same length as deps + (should + (equal (org-plot/zip-deps-with 5 1 '(2 4) '("points" "hist")) + '((2 . "points") (4 . "hist")))) + ;; same as above, but different order + (should + (equal (org-plot/zip-deps-with 5 1 '(4 2) '("points" "hist")) + '((4 . "points") (2 . "hist")))) + ;; fills in with "lines" + (should + (equal (org-plot/zip-deps-with 5 1 '(4 2 3) '("points")) + '((4 . "points") (2 . "lines") (3 . "lines"))))) + + +(provide 'test-org-plot) +;;; test-org-plot.el end here --------------2F575CDF2CF2CEACADC12428--