Console print a bar graph The objective is to print a graph from an array of numbers, of the design below. Printing the X and Y scale exactly as in the "design", with padding, is part of the challenge. The input array of numbers can be of virtually any range of integers in X and Y, but not 0 and not negative - though I would suggest keeping it small considering this is ASCII art! (x &lt; 15, y &lt; 50 or so).

Specifics

1) the graph should print the Y scale on the left, padded to the max length of the input, and with a pipe '|' between the number and the first column.

2) the bar should have all empty spaces with periods '.' filled spaces with pipes '|' and the number itself should be an 'o'.

3) there are three "tween" columns between each number that interpolates between the two numbers. These cannot just be a duplication of the previous or next column, but need to interpolate between the values linearly. (Unless two adjacent numbers in the list are only 1 apart or the same.)

4) The bottom of the graph should look: "  +---------" to the length of the graph.

5) There should be an X scale padded to the length of the max number, similar to the Y scale. The last digit of the x scale should align with the value (I guess that means we're limited to two digits...)

6) Lastly, there should be an "empty" column in the beginning of the graph and an "empty" column at the end.

Example

This:

 [5, 3, 7, 8, 10, 7, 8, 7, 9, 2]


Generates:

10|.................o.....................
09|................||...............o.....
08|.............o|||||......o......||.....
07|.........o||||||||||.o|||||..o||||.....
06|........|||||||||||||||||||||||||||....
05|.o.....||||||||||||||||||||||||||||....
04|.||...|||||||||||||||||||||||||||||....
03|.|||.o||||||||||||||||||||||||||||||...
02|.|||||||||||||||||||||||||||||||||||.o.
01|.|||||||||||||||||||||||||||||||||||||.
  +---------------------------------------
   01  02  03  04  05  06  07  08  09  10


Trailing spaces on each line, or trailing newlines at the end are permitted. As long as the output is visually the same.

Here's a working Python3 example, in "long hand" if you wish:

Try it online!
JavaScript (Node.js), 316 bytes



a=&gt;a.map((x,i)=&gt;{d=Math.abs(x-~-(n=a[i+1]))/3
for(i in n?"    ":s=" ")for(j in o="|o"[+!+i].padEnd(x&gt;n?x-d*i|0:x+d*i|0,"|")[S="padStart"](m,"."))A[j]+=o[j]},A=Array((m=Math.max(...a))+2).fill(""))&amp;&amp;A.map((x,i)=&gt;x?(m-i+"|.")[S](4,0)+x+".":i&gt;m?s+s+a.map((_,I)=&gt;s+(-~I+s)[S](3,0)).join``:"  +".padEnd(a.length*4+2,"-"))


Try it online!