{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotly plot of chord diagrams ##" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Circular layout or [Chord diagram](https://en.wikipedia.org/wiki/Chord_diagram) is a method of visualizing data that describe relationships. It was intensively promoted through [Circos](http://circos.ca/), a software package in Perl that was initially designed for displaying genomic data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In 2013 on [stackoverflow](http://stackoverflow.com/questions/19105801/chord-diagram-in-python) it was adressed the question whether there is a Python package for plotting chord diagrams, but it was closed as being considered *off topic*.\n", "After two years, in 2015, I presented in the initial version of this Jupyter Notebook a method to generate a chord diagram\n", "via Python Plotly." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This Jupyter Notebook is an update of the initial one, using Python 3.6, and Plotly 3.+." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We illustrate the method of generating a chord diagram from data recorded in a square matrix. The rows and columns represent the same entities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Suppose that for a community of 5 friends on Facebook we record the number of comments posted by each member on other friends wall. The data table is given in the next cell: " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image\n", "Image(filename='Data/Data-table.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The aim of our visualization is to illustrate the total number of posts by each community member, and the \n", "flows of posts between pairs of friends." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from numpy import pi\n", "import platform\n", "import plotly" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python version: 3.6.4\n", "Plotly version: 3.3.0\n" ] } ], "source": [ "print(f'Python version: {platform.python_version()}')\n", "print(f'Plotly version: {plotly.__version__}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define the array of data:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "matrix = np.array([[16, 3, 28, 0, 18],\n", " [18, 0, 12, 5, 29],\n", " [ 9, 11, 17, 27, 0], \n", " [19, 0, 31, 11, 12],\n", " [23, 17, 10, 0, 34]], dtype=int)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def check_data(data_matrix):\n", " L, M = data_matrix.shape\n", " if L != M:\n", " raise ValueError('Data array must have a (n,n) shape')\n", " return L" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "L = check_data(matrix)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " A chord diagram encodes information in two graphical objects:\n", " - ideograms, represented by distinctly colored arcs of circles;\n", " - ribbons, that are planar shapes bounded by two quadratic Bezier curves and two arcs of circle, that can degenerate to a point;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ideograms ###" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Summing up the entries on each matrix row, one gets a value (in our example this value is equal to the number of posts by a community member).\n", "Let us denote by total_comments the total number of posts recorded in this community.\n", "\n", "Theoretically the interval [0, total_comments) is mapped linearly onto the unit circle, identified with the interval $[0,2\\pi)$. \n", "\n", "For a better looking plot one proceeds as follows: starting from the angular position $0$, in counter-clockwise direction, one draws succesively, around the unit circle, two parallel arcs of length equal to a mapped row sum value, minus a fixed gap. Click the image below:\n", "\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from IPython.display import HTML" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HTML('')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we define the functions that process data in order to get ideogram ends.\n", "\n", "As we pointed out, the unit circle is oriented counter-clockwise.\n", "In order to get an arc of circle of end angular\n", "coordinates $\\theta_0<\\theta_1$, we define a function moduloAB that resolves the case when an arc contains\n", "the point of angular coordinate $0$ (for example $\\theta_0=2\\pi-\\pi/12$, $\\theta_1=\\pi/9$). The function corresponding to $a=-\\pi, b=\\pi$ allows to map the interval $[0,2\\pi)$ onto $[-\\pi, \\pi)$. Via this transformation we have:\n", "\n", "$\\theta_0\\mapsto \\theta'_0=-\\pi/12$, and \n", "\n", "$\\theta_1=\\mapsto \\theta'_1=\\pi/9$,\n", "\n", "and now $\\theta'_0<\\theta'_1$." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def moduloAB(x, a, b): #maps a real number onto the unit circle identified with \n", " #the interval [a,b), b-a=2*PI\n", " if a>= b:\n", " raise ValueError('Incorrect interval ends')\n", " y = (x-a) % (b-a)\n", " return y+b if y < 0 else y+a" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def test_2PI(x):\n", " return 0 <= x < 2*pi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute the row sums and the lengths of corresponding ideograms:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "row_sum = [np.sum(matrix[k,:]) for k in range(L)]\n", "\n", "#set the gap between two consecutive ideograms\n", "gap = 2*pi*0.005\n", "ideogram_length = 2*pi * np.asarray(row_sum) / sum(row_sum) - gap*np.ones(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next function returns the list of end angular coordinates for each ideogram arc:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def get_ideogram_ends(ideogram_len, gap):\n", " ideo_ends = []\n", " left = 0\n", " for k in range(len(ideogram_len)):\n", " right = left + ideogram_len[k]\n", " ideo_ends.append([left, right]) \n", " left = right + gap\n", " return ideo_ends " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "ideo_ends = get_ideogram_ends(ideogram_length, gap)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function make_ideogram_arc returns equally spaced points on an ideogram arc, expressed as complex\n", "numbers in polar form:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def make_ideogram_arc(R, phi, a=50):\n", " # R is the circle radius\n", " # phi is the list of angle coordinates of an arc ends\n", " # a is a parameter that controls the number of points to be evaluated on an arc\n", " if not test_2PI(phi[0]) or not test_2PI(phi[1]):\n", " phi = [moduloAB(t, 0, 2*pi) for t in phi]\n", " length = (phi[1]-phi[0]) % 2*pi \n", " nr = 5 if length <= pi/4 else int(a*length/pi)\n", "\n", " if phi[0] < phi[1]: \n", " theta = np.linspace(phi[0], phi[1], nr)\n", " else:\n", " phi = [moduloAB(t, -pi, pi) for t in phi]\n", " theta = np.linspace(phi[0], phi[1], nr)\n", " return R * np.exp(1j*theta) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The real and imaginary parts of these complex numbers will be used to define the ideogram as a [Plotly\n", "shape](https://plot.ly/python/shapes/) bounded by a SVG path." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.12583302-0.65j , 1.14814501-0.60972373j,\n", " 1.16901672-0.5686826j , 1.18842197-0.5269281j ,\n", " 1.20633642-0.48451259j, 1.22273759-0.44148929j,\n", " 1.23760491-0.39791217j, 1.25091973-0.3538359j ,\n", " 1.26266534-0.30931575j, 1.27282702-0.26440759j,\n", " 1.28139202-0.21916775j, 1.28834958-0.17365297j,\n", " 1.29369099-0.12792036j, 1.29740954-0.08202728j,\n", " 1.29950058-0.0360313j , 1.29996146+0.01000988j,\n", " 1.29879163+0.0560385j , 1.29599253+0.10199682j,\n", " 1.2915677 +0.1478272j , 1.28552267+0.19347214j,\n", " 1.27786503+0.23887437j])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "make_ideogram_arc(1.3, [11*pi/6, pi/17])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set ideograms labels and colors:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "labels=['Emma', 'Isabella', 'Ava', 'Olivia', 'Sophia']\n", "ideo_colors=['rgba(244, 109, 67, 0.75)',\n", " 'rgba(253, 174, 97, 0.75)',\n", " 'rgba(254, 224, 139, 0.75)',\n", " 'rgba(217, 239, 139, 0.75)',\n", " 'rgba(166, 217, 106, 0.75)']#brewer colors with alpha set on 0.75" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ribbons in a chord diagram ###" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While ideograms illustrate how many comments posted each member of the Facebook community, ribbons\n", "give a comparative information on the flows of comments from one friend to another.\n", "\n", "To illustrate this flow we map data onto the unit circle. More precisely, for each matrix row, $k$, the application:\n", "\n", "t$\\mapsto$ t*ideogram_length[k]/row_sum[k]\n", "\n", "maps the interval [0, row_sum[k]] onto\n", "the interval [0, ideogram_length[k]]. Hence each entry matrix[k][j] in the $k^{th}$ row is mapped to matrix[k][j] * ideogram_length[k] / row_value[k].\n", "\n", "The function map_data maps all matrix entries to the corresponding values in the intervals associated to ideograms:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def map_data(data_matrix, row_value, ideogram_length):\n", " mapped = np.zeros(data_matrix.shape)\n", " for j in range(L):\n", " mapped[:, j] = ideogram_length * data_matrix[:,j] / row_value\n", " return mapped " ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.27949818, 0.05240591, 0.48912181, 0. , 0.31443545],\n", " [0.31429952, 0. , 0.20953301, 0.08730542, 0.50637144],\n", " [0.15714976, 0.19207193, 0.29683843, 0.47144927, 0. ],\n", " [0.33291045, 0. , 0.54316969, 0.19273763, 0.21025923],\n", " [0.40429305, 0.2988253 , 0.17577959, 0. , 0.5976506 ]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mapped_data = map_data(matrix, row_sum, ideogram_length)\n", "mapped_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- To each pair of values (mapped_data[k][j], mapped_data[j][k]), $k<=j$, one associates a ribbon, that is a curvilinear filled rectangle (that can be degenerate), having as opposite sides two subarcs of the $k^{th}$ ideogram, respectively $j^{th}$ ideogram, and two arcs of quadratic Bézier curves." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we illustrate the ribbons associated to pairs (mapped_data[0][j], mapped_data[j][0]), $j=\\overline{0,4}$,\n", "that illustrate the flow of comments between Emma and all other friends, and herself:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HTML('')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- For a better looking chord diagram, \n", "[Circos documentation](http://circos.ca/presentations/articles/vis_tables1/) recommends to sort increasingly each row of the mapped_data. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The array idx_sort, defined below, has on each row the indices that sort the corresponding row in mapped_data:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[3, 1, 0, 4, 2],\n", " [1, 3, 2, 0, 4],\n", " [4, 0, 1, 2, 3],\n", " [1, 3, 4, 0, 2],\n", " [3, 2, 1, 0, 4]], dtype=int64)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "idx_sort = np.argsort(mapped_data, axis=1)\n", "idx_sort" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the following we call ribbon ends, the lists l=[l[0], l[1]], r=[r[0], r[1]] having as elements the angular coordinates\n", "of the ends of arcs that are opposite sides in a ribbon. These arcs are sub-arcs in the internal boundaries of\n", "the ideograms, connected by the ribbon\n", "(see the image above)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Compute the ribbon ends and store them as tuples \n", "in a list of lists ($L\\times L$):" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "def make_ribbon_ends(mapped_data, ideo_ends, idx_sort):\n", " L = mapped_data.shape[0]\n", " ribbon_boundary = np.zeros((L,L+1))\n", " for k in range(L):\n", " start = ideo_ends[k][0]\n", " ribbon_boundary[k][0] = start\n", " for j in range(1,L+1):\n", " J = idx_sort[k][j-1]\n", " ribbon_boundary[k][j] = start + mapped_data[k][J]\n", " start = ribbon_boundary[k][j]\n", " return [[(ribbon_boundary[k][j], ribbon_boundary[k][j+1] ) for j in range(L)] for k in range(L)] " ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ribbon ends starting from the ideogram[2]\n", " [(2.31580258464619, 2.31580258464619), (2.31580258464619, 2.472952342161697), (2.472952342161697, 2.6650242680139837), (2.6650242680139837, 2.9618626988766086), (2.9618626988766086, 3.43331197142313)]\n" ] } ], "source": [ "ribbon_ends = make_ribbon_ends(mapped_data, ideo_ends, idx_sort)\n", "print ('ribbon ends starting from the ideogram[2]\\n', ribbon_ends[2])" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "We note that ribbon_ends[k][j] corresponds to mapped_data[i][idx_sort[k][j]], i.e. the length of the arc of ends in ribbon_ends[k][j] is equal to mapped_data[i][idx_sort[k][j]]." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we define a few functions that compute the control points for Bézier ribbon sides." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function control_pts returns the cartesian coordinates of the control points, $b_0, b_1, b_2$, supposed as being initially located on the unit circle, and thus defined only by their angular coordinate. The angular coordinate\n", "of the point $b_1$ is the mean of angular coordinates of the points $b_0, b_2$.\n", "\n", "Since for a Bézier ribbon side only $b_0, b_2$ are placed on the unit circle, one gives radius as a parameter that controls position of $b_1$. radius is the distance of $b_1$ to the circle center." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def control_pts(angle, radius):\n", " #angle is a 3-list containing angular coordinates of the control points b0, b1, b2\n", " #radius is the distance from b1 to the origin O(0,0) \n", "\n", " if len(angle) != 3:\n", " raise InvalidInputError('angle must have len =3')\n", " b_cplx = np.array([np.exp(1j*angle[k]) for k in range(3)])\n", " b_cplx[1] = radius * b_cplx[1]\n", " return list(zip(b_cplx.real, b_cplx.imag))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "def ctrl_rib_chords(l, r, radius):\n", " # this function returns a 2-list containing control poligons of the two quadratic Bezier\n", " #curves that are opposite sides in a ribbon\n", " #l (r) the list of angular variables of the ribbon arc ends defining \n", " #the ribbon starting (ending) arc \n", " # radius is a common parameter for both control polygons\n", " if len(l) != 2 or len(r) != 2:\n", " raise ValueError('the arc ends must be elements in a list of len 2')\n", " return [control_pts([l[j], (l[j]+r[j])/2, r[j]], radius) for j in range(2)]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Each ribbon is colored with the color of one of the two ideograms it connects. \n", "We define an L-list of L-lists of colors for ribbons. Denote it by ribbon_color.\n", "\n", "ribbon_color[k][j] is the Plotly color string for the ribbon associated to mapped_data[k][j] and mapped_data[j][k], i.e. the ribbon connecting two subarcs in the $k^{th}$, respectively, $j^{th}$ ideogram. Hence this structure is symmetric." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initially we define:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "ribbon_color = [L * [ideo_colors[k]] for k in range(L)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and then eventually we are changing the color in a few positions.\n", "\n", "For our example we are perfotming the following color change:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "ribbon_color[0][4]=ideo_colors[4]\n", "ribbon_color[1][2]=ideo_colors[2]\n", "ribbon_color[2][3]=ideo_colors[3]\n", "ribbon_color[2][4]=ideo_colors[4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The symmetric locations are not modified, because we do not access \n", "ribbon_color[k][j], $k>j$, when drawing the ribbons." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Functions that return the Plotly SVG paths that are ribbon boundaries:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "def make_q_bezier(b):# defines the Plotly SVG path for a quadratic Bezier curve defined by the \n", " #list of its control points\n", " if len(b) != 3:\n", " raise valueError('control poligon must have 3 points')\n", " A, B, C = b \n", " return f'M {A[0]}, {A[1]} Q {B[0]}, {B[1]} {C[0]}, {C[1]}'" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "b=[(1,4), (-0.5, 2.35), (3.745, 1.47)]" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'M 1, 4 Q -0.5, 2.35 3.745, 1.47'" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "make_q_bezier(b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "make_ribbon_arc returns the Plotly SVG path corresponding to an arc represented by its end angular coordinates, theta0, theta1." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "def make_ribbon_arc(theta0, theta1):\n", "\n", " if test_2PI(theta0) and test_2PI(theta1):\n", " if theta0 < theta1:\n", " theta0 = moduloAB(theta0, -pi, pi)\n", " theta1 = moduloAB(theta1, -pi, pi)\n", " if theta0 *theta1 > 0:\n", " raise ValueError('incorrect angle coordinates for ribbon')\n", " \n", " nr = int(40 * (theta0 - theta1) / pi)\n", " if nr <= 2: nr = 3\n", " theta = np.linspace(theta0, theta1, nr)\n", " pts=np.exp(1j*theta)# points in polar complex form, on the given arc\n", " \n", " string_arc = ''\n", " for k in range(len(theta)):\n", " string_arc += f'L {pts.real[k]}, {pts.imag[k]} '\n", " return string_arc \n", " else:\n", " raise ValueError('the angle coordinates for an arc side of a ribbon must be in [0, 2*pi]')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'L 0.5000000000000001, 0.8660254037844386 L 0.5877852522924732, 0.8090169943749473 L 0.6691306063588582, 0.7431448254773941 L 0.7431448254773944, 0.6691306063588581 L 0.8090169943749475, 0.5877852522924731 L 0.8660254037844387, 0.49999999999999994 '" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "make_ribbon_arc(np.pi/3, np.pi/6)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Finally we are ready to define data and layout for the Plotly plot of the chord diagram." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "import plotly.plotly as py\n", "import plotly.graph_objs as go" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "def make_layout(title, plot_size):\n", "\n", " return dict(title=title,\n", " xaxis=dict(visible=False),\n", " yaxis=dict(visible=False),\n", " showlegend=False,\n", " width=plot_size,\n", " height=plot_size,\n", " margin=dict(t=25, b=25, l=25, r=25),\n", " hovermode='closest',\n", " ) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Function that returns the Plotly shape of an ideogram:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "def make_ideo_shape(path, line_color, fill_color):\n", " #line_color is the color of the shape boundary\n", " #fill_collor is the color assigned to an ideogram\n", " \n", " return dict(line=dict(color=line_color, \n", " width=0.45),\n", " path=path,\n", " layer='below',\n", " type='path',\n", " fillcolor=fill_color) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We generate two types of ribbons: a ribbon connecting subarcs in two distinct ideograms, respectively\n", "a ribbon from one ideogram to itself (it corresponds to mapped_data[k][k], i.e. it gives the flow of comments\n", "from a community member to herself)." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "def make_ribbon(l, r, line_color, fill_color, radius=0.2):\n", " #l=[l[0], l[1]], r=[r[0], r[1]] represent the opposite arcs in the ribbon \n", " #line_color is the color of the shape boundary\n", " #fill_color is the fill color for the ribbon shape\n", " \n", " poligon = ctrl_rib_chords(l,r, radius)\n", " b, c = poligon \n", " \n", " return dict(line=dict(color=line_color, \n", " width=0.5),\n", " path=make_q_bezier(b) + make_ribbon_arc(r[0], r[1])+\n", " make_q_bezier(c[::-1]) + make_ribbon_arc(l[1], l[0]),\n", " type='path',\n", " layer='below',\n", " fillcolor = fill_color, \n", " )\n", "\n", "def make_self_rel(l, line_color, fill_color, radius):\n", " #radius is the radius of Bezier control point b_1\n", " \n", " b = control_pts([l[0], (l[0]+l[1])/2, l[1]], radius) \n", " \n", " return dict(line = dict(color=line_color, \n", " width=0.5),\n", " path = make_q_bezier(b)+make_ribbon_arc(l[1], l[0]),\n", " type = 'path',\n", " layer = 'below',\n", " fillcolor = fill_color \n", " )" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "def invPerm(perm):\n", " # function that returns the inverse of a permutation, perm\n", " inv = [0] * len(perm)\n", " for i, s in enumerate(perm):\n", " inv[s] = i\n", " return inv" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "layout=make_layout('Chord diagram', 400) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us explain the key point of associating ribbons to right data:\n", " \n", "From the definition of ribbon_ends we notice that ribbon_ends[k][j] corresponds to data stored in\n", "matrix[k][sigma[j]], where sigma is the permutation of indices $0, 1, \\ldots L-1$, that sort the row k in mapped_data.\n", "If sigma_inv is the inverse permutation of sigma, we get that to matrix[k][j] corresponds the\n", "ribbon_ends[k][sigma_inv[j]]." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ribbon_info is a list of dicts setting the information that is displayed when hovering the mouse over the ribbon ends." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set the radius of Bézier control point, $b_1$, for each ribbon associated to a diagonal data entry:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "radii_sribb=[0.4, 0.30, 0.35, 0.39, 0.12]# these value are set after a few trials " ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "ribbon_info=[]\n", "shapes=[]\n", "for k in range(L):\n", " \n", " sigma = idx_sort[k]\n", " sigma_inv = invPerm(sigma)\n", " for j in range(k, L):\n", " if matrix[k][j] == 0 and matrix[j][k]==0: continue\n", " eta = idx_sort[j]\n", " eta_inv = invPerm(eta)\n", " l = ribbon_ends[k][sigma_inv[j]] \n", " \n", " if j == k:\n", " shapes.append(make_self_rel(l, 'rgb(175,175,175)' ,\n", " ideo_colors[k], radius=radii_sribb[k])) \n", " z = 0.9*np.exp(1j*(l[0]+l[1])/2)\n", " \n", " #the text below will be displayed when hovering the mouse over the ribbon\n", " text = f'{labels[k]} commented on {int(matrix[k][k])} of herself Fb posts'\n", "\n", " ribbon_info.append(go.Scatter(x=[z.real],\n", " y=[z.imag],\n", " mode='markers',\n", " marker=dict(size=0.5, color=ideo_colors[k]),\n", " text=text,\n", " hoverinfo='text'\n", " )\n", " )\n", " else:\n", " r = ribbon_ends[j][eta_inv[k]]\n", " zi = 0.9 * np.exp(1j*(l[0]+l[1])/2)\n", " zf = 0.9 * np.exp(1j*(r[0]+r[1])/2)\n", " #texti and textf are the strings that will be displayed when hovering the mouse \n", " #over the two ribbon ends\n", " texti = f'{labels[k]} commented on {int(matrix[k][j])} of {labels[j]} Fb posts'\n", " textf = f'{labels[j]} commented on {int(matrix[j][k])} of {labels[k]} Fb posts'\n", " \n", " ribbon_info.append(go.Scatter(x=[zi.real],\n", " y=[zi.imag],\n", " mode='markers',\n", " marker=dict(size=0.5, color=ribbon_color[k][j]),\n", " text=texti,\n", " hoverinfo='text'\n", " )\n", " ),\n", " ribbon_info.append(go.Scatter(x=[zf.real],\n", " y=[zf.imag],\n", " mode='markers',\n", " marker=dict(size=0.5, color=ribbon_color[k][j]),\n", " text=textf,\n", " hoverinfo='text'\n", " )\n", " )\n", " r = (r[1], r[0]) # IMPORTANT!!! Reverse these arc ends because otherwise you get\n", " # a twisted ribbon\n", " #append the ribbon shape\n", " shapes.append(make_ribbon(l, r, 'rgb(175,175,175)' , ribbon_color[k][j]))\n", " \n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ideograms` is a list of dicts that set the position, and color of ideograms, as well as the information associated to each ideogram.\n" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "ideograms = []\n", "for k in range(len(ideo_ends)):\n", " z = make_ideogram_arc(1.1, ideo_ends[k])\n", " zi = make_ideogram_arc(1.0, ideo_ends[k])\n", " m = len(z)\n", " n = len(zi)\n", " ideograms.append(go.Scatter(x=z.real,\n", " y=z.imag,\n", " mode='lines',\n", " line=dict(color=ideo_colors[k], shape='spline', width=0.25),\n", " text=f'{labels[k]}
{int(row_sum[k])} comments', \n", " hoverinfo='text'\n", " )\n", " )\n", " \n", " \n", " path = 'M '\n", " for s in range(m):\n", " path += f'{z.real[s]}, {z.imag[s]} L '\n", " \n", " Zi = np.array(zi.tolist()[::-1]) \n", "\n", " for s in range(m):\n", " path += f'{Zi.real[s]}, {Zi.imag[s]} L '\n", " path += f'{z.real[0]} ,{z.imag[0]}' \n", " \n", " shapes.append(make_ideo_shape(path,'rgb(150,150,150)' , ideo_colors[k]))\n", " " ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/vnd.plotly.v1+html": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "data": [ { "hoverinfo": "text", "line": { "color": "rgba(244, 109, 67, 0.75)", "shape": "spline", "width": 0.25 }, "mode": "lines", "text": "Emma
65 comments", "type": "scatter", "uid": "931475a8-ddc1-11e8-a94e-8df02786cf32", "x": [ 1.1, 1.0997655951500185, 1.0990624805012257, 1.0978909557145013, 1.0962515200827398, 1.0941448723180562, 1.0915719102540018, 1.0885337304629161, 1.0850316277885774, 1.081067094794353, 1.0766418211270827, 1.0717576927969663, 1.0664167913737648, 1.0606213930996546, 1.0543739679191135, 1.047677178426255, 1.0405338787300547, 1.0329471132379546, 1.0249201153583685, 1.0164563061226302, 1.0075592927269832, 0.9982328669952286, 0.9884810037626837, 0.9783078591821446, 0.9677177689525739, 0.956715246471265, 0.9453049809102757, 0.9334918352179462, 0.921280844046356, 0.9086772116056028, 0.8956863094458166, 0.8823136741678552, 0.8685650050636575, 0.8544461616872575, 0.8399631613574979, 0.8251221765935056, 0.8099295324840206, 0.7943917039917036, 0.7785153131935667, 0.7623071264587071, 0.745774051564543, 0.7289231347527839, 0.7117615577263888, 0.6942966345887909, 0.6765358087266955, 0.6584866496377787, 0.6401568497046377, 0.62155422091637, 0.6026866915391761, 0.5835623027374076, 0.5641892051464968, 0.544575655399234, 0.5247300126068668, 0.504660734796525, 0.4843763753064892, 0.4638855791408384 ], "y": [ 0, 0.022707613796388415, 0.045405549820403415, 0.06808413442424753, 0.09073370220751736, 0.11334460013650678, 0.13590719165823945, 0.1584118608074774, 0.18084901630495556, 0.20320909564509498, 0.22548256917145337, 0.24765994413817516, 0.2697317687557112, 0.2916886362190827, 0.31352118871697376, 0.33522012141994245, 0.3567761864460525, 0.37818019680223364, 0.3994230302996921, 0.4204956334417022, 0.44138902528212165, 0.4620943012529869, 0.4826026369595566, 0.5029052919411857, 0.5229936133964288, 0.5428590398707815, 0.5624931049054942, 0.5818874406458959, 0.601033781407696, 0.619923967199742, 0.6385499472017307, 0.6569037831953931, 0.6749776529476875, 0.6927638535445634, 0.7102548046738706, 0.7274430518560171, 0.7443212696209991, 0.7608822646304472, 0.7771189787433601, 0.793024492024218, 0.8085920256921945, 0.8238149450102097, 0.8386867621125927, 0.8532011387701491, 0.8673518890914553, 0.8811329821592275, 0.8945385446006415, 0.9075628630905104, 0.9202003867862489, 0.9324457296935915, 0.9442936729620528, 0.9557391671091516, 0.9667773341724545, 0.9774034697885167, 0.9876130451978383, 0.997401709174979 ] }, { "hoverinfo": "text", "line": { "color": "rgba(253, 174, 97, 0.75)", "shape": "spline", "width": 0.25 }, "mode": "lines", "text": "Isabella
64 comments", "type": "scatter", "uid": "9314890c-ddc1-11e8-a367-8df02786cf32", "x": [ 0.4323275348193161, 0.41130425246096874, 0.3901048282580361, 0.3687383409050884, 0.34721394064181277, 0.32554084533440814, 0.30372833652801345, 0.2817857554718704, 0.2597224991189131, 0.23754801610150683, 0.21527180268505078, 0.19290339870118606, 0.17045238346234223, 0.14792837165938022, 0.12534100924408018, 0.10269996929824597, 0.08001494789118721, 0.05729565992736058, 0.03455183498594124, 0.011793213154113635, -0.010970459144141733, -0.03372943332197133, -0.05647396280450179, -0.07919430720282757, -0.1018807364853534, -0.12452353514469715, -0.14711300635837654, -0.16963947614149144, -0.1920932974896261, -0.21446485451019826, -0.23674456654048387, -0.2589228922505544, -0.28099033372936943, -0.3029374405522756, -0.3247548138281701, -0.3464331102245936, -0.3679630459690298, -0.38933540082469953, -0.41054102203914594, -0.4315708282639174, -0.4524158134436726, -0.47306705067304167, -0.4935156960195904, -0.5137529923112528, -0.5337702728866047, -0.5535589653063796, -0.5731105950246337, -0.5924167890179837, -0.6114692793713729, -0.6302599068188205, -0.6487806242376436, -0.6670235000946537, -0.6849807218428493, -0.702644599267157, -0.7200075677777785 ], "y": [ 1.0114805498065957, 1.0202101802606773, 1.0285029037245195, 1.0363551688231998, 1.0437636128089463, 1.0507250630012397, 1.057236538145521, 1.063295249689919, 1.068898602979453, 1.0740441983671987, 1.078729832241942, 1.0829534979718802, 1.086713386763965, 1.0900078884385216, 1.0928355921188126, 1.0951952868352473, 1.0970859620439826, 1.09850680805969, 1.0994572164023049, 1.0999367800576094, 1.0999452936515375, 1.0994827535381257, 1.0985493578010757, 1.097145506168924, 1.095271799843857, 1.0929290412442465, 1.09011823366101, 1.0868405808279522, 1.0830974864062617, 1.078890553383391, 1.0742215833865743, 1.0690925759112762, 1.0635057274649056, 1.057463430626155, 1.0509682730203755, 1.0440230362114213, 1.0366306945104384, 1.0287944137021112, 1.0205175496889085, 1.0118036470539116, 1.0026564375428406, 0.9930798384659262, 0.9830779510203143, 0.9726550585337199, 0.9618156246300846, 0.9505642913180204, 0.9389058770028605, 0.9268453744231677, 0.9143879485125852, 0.9015389341879428, 0.8883038340645693, 0.8746883160997851, 0.8606982111655915, 0.846339510551585, 0.8316183633991785 ] }, { "hoverinfo": "text", "line": { "color": "rgba(254, 224, 139, 0.75)", "shape": "spline", "width": 0.25 }, "mode": "lines", "text": "Ava
64 comments", "type": "scatter", "uid": "9314890d-ddc1-11e8-8f32-8df02786cf32", "x": [ -0.7457740515645426, -0.7623466709064141, -0.7785928138065192, -0.7945055228226232, -0.8100779833061977, -0.8253035263208099, -0.8401756314981058, -0.8546879298301727, -0.8688342063970766, -0.8826084030284155, -0.8960046208977417, -0.9090171230487472, -0.9216403368521239, -0.9338688563920554, -0.9456974447813088, -0.9571210364039442, -0.9681347390846721, -0.9787338361839385, -0.9889137886178343, -0.9986702368019678, -1.0079990025184633, -1.016896090705293, -1.025357691167169, -1.0333801802072666, -1.0409601221790803, -1.048094270957746, -1.0547795713301993, -1.0610131603035777, -1.0667923683313019, -1.0721147204563146, -1.0769779373709865, -1.0813799363932324, -1.0853188323584255, -1.088792938426722, -1.0918007668054541, -1.0943410293862794, -1.0964126382968162, -1.0980147063665266, -1.0991465475066502, -1.099807677004021, -1.0999978117286489, -1.0997168702549682, -1.098964972896711, -1.0977424416553803, -1.0960498000823535, -1.0938877730546708, -1.091257286464603, -1.0881594668231396, -1.0845956407775557, -1.0805673345432736, -1.0760762732502587, -1.0711243802042278, -1.0657137760629916, -1.0598467779282765, -1.053525898353424 ], "y": [ 0.808592025692195, 0.7929864774117575, 0.7770413311329372, 0.7607634153955817, 0.7441597012487063, 0.7272372992651274, 0.7100034564963463, 0.6924655533689845, 0.6746311005241029, 0.6565077356007546, 0.6381032199651514, 0.6194254353868422, 0.6004823806633327, 0.5812821681945823, 0.5618330205088551, 0.5421432667414028, 0.5222213390675012, 0.5020757690913511, 0.48171518419240383, 0.46114830383066785, 0.44038393581258517, 0.4194309725190695, 0.398298387097328, 0.3769952296180914, 0.35553062319990675, 0.333913760102142, 0.31215389778838426, 0.2902603549619111, 0.26824250757494045, 0.24610978481335982, 0.2238716650586573, 0.20153767182878937, 0.1791173696997139, 0.15662036020934242, 0.13405627774566328, 0.11143478542079445, 0.08876557093273985, 0.06605834241661238, 0.04332282428710488, 0.020568753073993442, -0.0021941267475522296, -0.024956066930058786, -0.04770731962845462, -0.07043814157460541, -0.09313879824988472, -0.11579956805400184, -0.13841074646829762, -0.16096265021172032, -0.18344562138771167, -0.20585003162021911, -0.22816628617706627, -0.2503848280789174, -0.27249614219206886, -0.294490759303328, -0.3163592601752179 ] }, { "hoverinfo": "text", "line": { "color": "rgba(217, 239, 139, 0.75)", "shape": "spline", "width": 0.25 }, "mode": "lines", "text": "Olivia
73 comments", "type": "scatter", "uid": "9314890e-ddc1-11e8-8fcf-8df02786cf32", "x": [ -1.0430689624159495, -1.035641456188567, -1.0277731880782084, -1.019467506765682, -1.0107279470918464, -1.001558228553208, -0.9919622537189289, -0.9819441065699192, -0.9715080507607232, -0.9606585278049385, -0.9494001551849365, -0.9377377243866948, -0.9256761988605737, -0.9132207119089054, -0.9003765645012962, -0.8871492230185699, -0.8735443169263148, -0.8595676363790191, -0.8452251297558249, -0.8305229011289356, -0.8154672076657664, -0.8000644569659372, -0.7843212043342399, -0.768244149990749, -0.7518401362192517, -0.7351161444552197, -0.7180792923145584, -0.7007368305643983, -0.6830961400372184, -0.6651647284896145, -0.6469502274070502, -0.6284603887559492, -0.6097030816845088, -0.5906862891736496, -0.5714181046395103, -0.5519067284889455, -0.5321604646294905, -0.5121877169352742, -0.49199698567038824, -0.4715968638712332, -0.4509960336893812, -0.4302032626965123, -0.40922740015299675, -0.3880773732417062, -0.3667621832686762, -0.3452909018321992, -0.323672666962025, -0.3019166792302736, -0.2800321978357356, -0.25802853666322084, -0.23591506031963358, -0.21370118014845954, -0.19139635022436324, -0.16901006332959864, -0.14655184691394638, -0.12403125903989763, -0.10145788431480342, -0.07884132981174252, -0.056191220980803466, -0.03351719755256993, -0.01082890943551281, 0.011863987390943551, 0.03455183498593975 ], "y": [ -0.34929520415332754, -0.37073814778577185, -0.39202330781160927, -0.4131416254130836, -0.4340841127794266, -0.4548418569320109, -0.47540602351764893, -0.4957678605684353, -0.5159187022265235, -0.5358499724322547, -0.5555531885740722, -0.5750199650986594, -0.5942420170797752, -0.6132111637442621, -0.631919331953726, -0.6503585596404092, -0.6685209991957907, -0.6863989208104763, -0.7039847157639498, -0.7212708996627942, -0.738250115625997, -0.7549151374159881, -0.7712588725140785, -0.787274365138985, -0.8029547992071642, -0.8182935012336912, -0.8332839431724479, -0.8479197451944152, -0.8621946784028844, -0.8761026674844322, -0.889637793294533, -0.9027942953767051, -0.9155665744141238, -0.9279491946126488, -0.9399368860142632, -0.9515245467399303, -0.9627072451609185, -0.9734802219976694, -0.9838388923453129, -0.9937788476249723, -1.0032958574600248, -1.0123858714765215, -1.0210450210269963, -1.0292696208369396, -1.0370561705732213, -1.0444013563338124, -1.0513020520581562, -1.0577553208576, -1.0637584162653133, -1.0693087834051664, -1.0744040600790672, -1.079042077772297, -1.0832208625764153, -1.0869386360293414, -1.0901938158722564, -1.0929850167230006, -1.0953110506656838, -1.0971709277562527, -1.0985638564438058, -1.099489243907471, -1.0999466963087066, -1.0999360189589156, -1.0994572164023049 ] }, { "hoverinfo": "text", "line": { "color": "rgba(166, 217, 106, 0.75)", "shape": "spline", "width": 0.25 }, "mode": "lines", "text": "Sophia
84 comments", "type": "scatter", "uid": "9314890f-ddc1-11e8-bbb9-8df02786cf32", "x": [ 0.06906957148224314, 0.0915673366810486, 0.11402659344829932, 0.13643789659553252, 0.15879182110106924, 0.18107896607368562, 0.20328995870613584, 0.22541545821686346, 0.24744615977824952, 0.2693727984297304, 0.29118615297415934, 0.3128770498557587, 0.3344363670180376, 0.35585503774005167, 0.3771240544493915, 0.3982344725102963, 0.4191774139853001, 0.4399440713688274, 0.46052571129116965, 0.48091367819128317, 0.501099397956866, 0.5210743815301803, 0.5408302284781054, 0.5603586305249242, 0.5796513750463436, 0.5987003485232986, 0.6174975399540724, 0.6360350442233059, 0.6543050654264739, 0.6722999201484366, 0.6900120406946805, 0.7074339782738956, 0.7245584061305474, 0.7413781226261266, 0.7578860542677817, 0.7740752586830595, 0.7899389275395061, 0.8054703894078921, 0.8206631125678681, 0.8355107077548652, 0.8500069308470849, 0.8641456854914499, 0.8779210256674115, 0.8913271581875348, 0.9043584451338103, 0.9170094062286669, 0.9292747211396907, 0.9411492317170775, 0.9526279441628818, 0.9637060311311461, 0.9743788337580305, 0.9846418636210871, 0.9944908046268554, 1.0039215148259863, 1.0129300281551281, 1.0215125561048457, 1.02966548931287, 1.037385399082006, 1.0446690388220643, 1.0515133454152061, 1.057915440504132, 1.0638726317025664, 1.069382413727536, 1.0744424694529593, 1.0790506708841103, 1.0832050800525406, 1.0869039498310875, 1.0901457246686248, 1.092929041244246, 1.095252729040606, 1.097115810836179, 1.0985175031162269, 1.0994572164023046 ], "y": [ -1.097829401271099, -1.0961822033098054, -1.0940740084594718, -1.091505703316564, -1.0884783679758667, -1.0849932755762524, -1.0810518917652647, -1.0766558740827459, -1.0718070712637593, -1.0665075224611105, -1.0607594563877851, -1.0545652903796698, -1.0479276293789455, -1.0408492648385868, -1.0333331735484217, -1.0253825163832502, -1.0170006369735451, -1.0081910602992967, -0.99895749120759, -0.9893038128545403, -0.9792340850722399, -0.9687525426614065, -0.9578635936104475, -0.946571817241688, -0.9348819622855514, -0.9227989448834892, -0.9103278465205097, -0.8974739118881716, -0.8842425466789402, -0.8706393153128371, -0.8566699385973356, -0.8423402913214882, -0.8276563997852978, -0.8126244392653719, -0.797250731417923, -0.7815417416202124, -0.7655040762515474, -0.7491444799149888, -0.7324698326009194, -0.7154871467936823, -0.698203564522496, -0.6806263543578902, -0.6627629083549264, -0.6446207389444847, -0.6262074757739301, -0.6075308624984808, -0.5885987535246319, -0.5694191107070036, -0.5500000000000014, -0.5303495880656972, -0.510476138839359, -0.490388010054072, -0.4700936497259137, -0.44960159260115734, -0.4289204565670091, -0.40805893902737206, -0.38702581324517393, -0.36582992465279196, -0.34448018713212636, -0.3229855792658883, -0.30135514056167745, -0.27959796765043815, -0.25772321046089214, -0.23574006837155836, -0.21365778634197166, -0.19148565102474221, -0.16923298686007143, -0.1469091521543812, -0.12452353514469966, -0.10208555005046005, -0.07960463311437234, -0.057090238634033216, -0.03455183498594316 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(244, 109, 67, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Emma commented on 16 of herself Fb posts", "type": "scatter", "uid": "93148910-ddc1-11e8-b3b5-8df02786cf32", "x": [ 0.8834354684075095 ], "y": [ 0.17187720372290285 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(244, 109, 67, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Emma commented on 3 of Isabella Fb posts", "type": "scatter", "uid": "93148911-ddc1-11e8-8036-8df02786cf32", "x": [ 0.8996910500157038 ], "y": [ 0.023579960170459113 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(244, 109, 67, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Isabella commented on 18 of Emma Fb posts", "type": "scatter", "uid": "93148912-ddc1-11e8-a06e-8df02786cf32", "x": [ -0.045043394102669145 ], "y": [ 0.8988721225222817 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(244, 109, 67, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Emma commented on 28 of Ava Fb posts", "type": "scatter", "uid": "93148913-ddc1-11e8-87ff-8df02786cf32", "x": [ 0.5658408586855317 ], "y": [ 0.6998743620408024 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(244, 109, 67, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Ava commented on 9 of Emma Fb posts", "type": "scatter", "uid": "93148914-ddc1-11e8-92e6-8df02786cf32", "x": [ -0.660225837191889 ], "y": [ 0.6116386546845035 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(244, 109, 67, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Emma commented on 0 of Olivia Fb posts", "type": "scatter", "uid": "93148915-ddc1-11e8-a831-8df02786cf32", "x": [ 0.9 ], "y": [ 0 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(244, 109, 67, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Olivia commented on 19 of Emma Fb posts", "type": "scatter", "uid": "93148916-ddc1-11e8-8c73-8df02786cf32", "x": [ -0.564659437753834 ], "y": [ -0.7008278814056446 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(166, 217, 106, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Emma commented on 18 of Sophia Fb posts", "type": "scatter", "uid": "93148917-ddc1-11e8-8e8d-8df02786cf32", "x": [ 0.7944712355152027 ], "y": [ 0.422865765863054 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(166, 217, 106, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Sophia commented on 23 of Emma Fb posts", "type": "scatter", "uid": "93148918-ddc1-11e8-8343-8df02786cf32", "x": [ 0.6065821003304672 ], "y": [ -0.6648745412171224 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(254, 224, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Isabella commented on 12 of Ava Fb posts", "type": "scatter", "uid": "93149c68-ddc1-11e8-8303-8df02786cf32", "x": [ 0.18923948375343566 ], "y": [ 0.8798797746219271 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(254, 224, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Ava commented on 11 of Isabella Fb posts", "type": "scatter", "uid": "93149c69-ddc1-11e8-becc-8df02786cf32", "x": [ -0.7564434585146873 ], "y": [ 0.4876405377635647 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(253, 174, 97, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Isabella commented on 5 of Olivia Fb posts", "type": "scatter", "uid": "93149c6a-ddc1-11e8-a496-8df02786cf32", "x": [ 0.31727114302905396 ], "y": [ 0.842222667589182 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(253, 174, 97, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Olivia commented on 0 of Isabella Fb posts", "type": "scatter", "uid": "93149c6b-ddc1-11e8-b59d-8df02786cf32", "x": [ -0.8534200601585041 ], "y": [ -0.28578698521635887 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(253, 174, 97, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Isabella commented on 29 of Sophia Fb posts", "type": "scatter", "uid": "93149c6c-ddc1-11e8-97f1-8df02786cf32", "x": [ -0.3998795608801893 ], "y": [ 0.8062855181573504 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(253, 174, 97, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Sophia commented on 17 of Isabella Fb posts", "type": "scatter", "uid": "93149c6d-ddc1-11e8-b9a7-8df02786cf32", "x": [ 0.34052412556597655 ], "y": [ -0.8330926238465487 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(254, 224, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Ava commented on 17 of herself Fb posts", "type": "scatter", "uid": "93149c6e-ddc1-11e8-acc1-8df02786cf32", "x": [ -0.851976424197158 ], "y": [ 0.29006235986805357 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(217, 239, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Ava commented on 27 of Olivia Fb posts", "type": "scatter", "uid": "93149c6f-ddc1-11e8-9a4f-8df02786cf32", "x": [ -0.8985894366516359 ], "y": [ -0.05036888263695705 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(217, 239, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Olivia commented on 31 of Ava Fb posts", "type": "scatter", "uid": "93149c70-ddc1-11e8-a750-8df02786cf32", "x": [ -0.21408002940656584 ], "y": [ -0.8741680279038372 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(166, 217, 106, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Ava commented on 0 of Sophia Fb posts", "type": "scatter", "uid": "93149c71-ddc1-11e8-b93b-8df02786cf32", "x": [ -0.6101787694618984 ], "y": [ 0.6615752937481595 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(166, 217, 106, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Sophia commented on 10 of Ava Fb posts", "type": "scatter", "uid": "93149c72-ddc1-11e8-a97e-8df02786cf32", "x": [ 0.13513647395069192 ], "y": [ -0.8897966809379398 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(217, 239, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Olivia commented on 11 of herself Fb posts", "type": "scatter", "uid": "93149c73-ddc1-11e8-8a90-8df02786cf32", "x": [ -0.8219619474183434 ], "y": [ -0.3665768091358816 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(217, 239, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Olivia commented on 12 of Sophia Fb posts", "type": "scatter", "uid": "93149c74-ddc1-11e8-ae6d-8df02786cf32", "x": [ -0.7319660076808625 ], "y": [ -0.5236656983226413 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(217, 239, 139, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Sophia commented on 0 of Olivia Fb posts", "type": "scatter", "uid": "93149c75-ddc1-11e8-9faf-8df02786cf32", "x": [ 0.05651146757638075 ], "y": [ -0.8982240555854445 ] }, { "hoverinfo": "text", "marker": { "color": "rgba(166, 217, 106, 0.75)", "size": 0.5 }, "mode": "markers", "text": "Sophia commented on 34 of herself Fb posts", "type": "scatter", "uid": "93149c76-ddc1-11e8-baeb-8df02786cf32", "x": [ 0.8513677330490204 ], "y": [ -0.2918441075693874 ] } ], "layout": { "height": 400, "hovermode": "closest", "margin": { "b": 25, "l": 25, "r": 25, "t": 25 }, "shapes": [ { "fillcolor": "rgba(244, 109, 67, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 0.9986271246379248, 0.052381923765651435 Q 0.3926379859588931, 0.07638986832129016 0.9454236233438847, 0.3258437853071935L 0.9454236233438847, 0.3258437853071935 L 0.9815949648972327, 0.1909746708032254 L 0.9986271246379248, 0.052381923765651435 ", "type": "path" }, { "fillcolor": "rgba(244, 109, 67, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 1.0, 0.0 Q 0.1260365751641613, 0.15528934838194383 -0.2057390860444357, 0.9786068814767247L -0.2057390860444357, 0.9786068814767247 L -0.10227324770180724, 0.9947563434351775 L 0.002314117523173086, 0.9999973224264598 L 0.10687610617050966, 0.9942723459544824 M 0.10687610617050966, 0.9942723459544824 Q 0.14523411998352662, 0.13750291048778054 0.9986271246379248, 0.052381923765651435L 0.9986271246379248, 0.052381923765651435 L 0.9996567222396708, 0.026199955744954567 L 1.0, 0.0 ", "type": "path" }, { "fillcolor": "rgba(244, 109, 67, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 0.7982937240617209, 0.6022683207040438 Q 0.0022300314586536675, 0.19998756701278564 -0.7846652886243488, 0.6199196599786679L -0.7846652886243488, 0.6199196599786679 L -0.7335842635465433, 0.6795985052050039 L -0.6779764105132204, 0.7350836597201772 M -0.6779764105132204, 0.7350836597201772 Q -0.030843541116634805, 0.19760737833235495 0.4217141628553076, 0.906728826522708L 0.4217141628553076, 0.906728826522708 L 0.5082567180438317, 0.8612056134067596 L 0.5899393342905719, 0.8074475722031721 L 0.6659809643147518, 0.7459687360542621 L 0.7356544998149338, 0.6773569641644201 L 0.7982937240617209, 0.6022683207040438 ", "type": "path" }, { "fillcolor": "rgba(244, 109, 67, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 1.0, 0.0 Q -0.10102404845497259, 0.17260979588009295 -0.48970708168836735, -0.8718870191396719L -0.48970708168836735, -0.8718870191396719 L -0.5832499368908383, -0.8122927496394592 L -0.6696178014301505, -0.742705863722545 L -0.74774820005775, -0.6639824013559359 M -0.74774820005775, -0.6639824013559359 Q -0.07102841684033934, 0.18696246682464104 1.0, 0.0L 1.0, 0.0 L 1.0, 0.0 L 1.0, 0.0 ", "type": "path" }, { "fillcolor": "rgba(166, 217, 106, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 0.9454236233438847, 0.3258437853071935 Q -0.1977964204535796, 0.029607027134630953 0.8085771057522991, -0.5883902310994255L 0.8085771057522991, -0.5883902310994255 L 0.7450811716135709, -0.6669737983661341 L 0.6739801114782968, -0.7387494902412471 L 0.595999661737917, -0.8029846842924767 L 0.511935777475095, -0.8590237247835301 M 0.511935777475095, -0.8590237247835301 Q -0.1962670575746901, 0.038460916668395906 0.7982937240617209, 0.6022683207040438L 0.7982937240617209, 0.6022683207040438 L 0.8569222257994936, 0.5154457284048842 L 0.9061456087118098, 0.42296588019875037 L 0.9454236233438847, 0.3258437853071935 ", "type": "path" }, { "fillcolor": "rgba(254, 224, 139, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 0.31135030516243195, 0.9502952106978444 Q -0.07581697403657635, 0.18507238164549866 -0.8885743451377085, 0.4587326379963525L -0.8885743451377085, 0.4587326379963525 L -0.8404927316829859, 0.5418228197372941 L -0.7846652886243488, 0.6199196599786679 M -0.7846652886243488, 0.6199196599786679 Q -0.07742984627059196, 0.18440341348931832 0.10687610617050966, 0.9942723459544824L 0.10687610617050966, 0.9942723459544824 L 0.21026609305937294, 0.9776441940243634 L 0.31135030516243195, 0.9502952106978444 ", "type": "path" }, { "fillcolor": "rgba(253, 174, 97, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 0.39302503165392366, 0.9195277725514506 Q -0.1355952821026441, 0.14701673194403544 -0.9482445112872268, -0.3175410946848432L -0.9482445112872268, -0.3175410946848432 L -0.9482445112872268, -0.3175410946848432 L -0.9482445112872268, -0.3175410946848432 M -0.9482445112872268, -0.3175410946848432 Q -0.14188175101265688, 0.14095945775144866 0.31135030516243195, 0.9502952106978444L 0.31135030516243195, 0.9502952106978444 L 0.3525234922545044, 0.9358029639879799 L 0.39302503165392366, 0.9195277725514506 ", "type": "path" }, { "fillcolor": "rgba(253, 174, 97, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M -0.2057390860444357, 0.9786068814767247 Q -0.18629660917224217, -0.07275694750966989 0.511935777475095, -0.8590237247835301L 0.511935777475095, -0.8590237247835301 L 0.3783601395177517, -0.9256584709406096 L 0.236353638610496, -0.971667102209177 M 0.236353638610496, -0.971667102209177 Q -0.17775774100707686, -0.09166343606946548 -0.6545523343434353, 0.7560166939992528L -0.6545523343434353, 0.7560166939992528 L -0.5747642621254271, 0.8183190349633896 L -0.48908616774193736, 0.8722354730939952 L -0.3983960561565114, 0.9172134879290306 L -0.30362329407238353, 0.9527921574491652 L -0.2057390860444357, 0.9786068814767247 ", "type": "path" }, { "fillcolor": "rgba(254, 224, 139, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M -0.8885743451377085, 0.4587326379963525 Q -0.33132416496556144, 0.11280202883757637 -0.9838920030069047, 0.1787638845490357L -0.9838920030069047, 0.1787638845490357 L -0.9466404713301756, 0.3222915109645039 L -0.8885743451377085, 0.4587326379963525 ", "type": "path" }, { "fillcolor": "rgba(217, 239, 139, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M -0.9838920030069047, 0.1787638845490357 Q -0.15151045381080996, -0.1305549018077928 0.031410759078126155, -0.9995065603657316L 0.031410759078126155, -0.9995065603657316 L -0.07714129712678908, -0.9970201704467149 L -0.1847838781864136, -0.9827791808755356 L -0.29024790702148157, -0.9569514890889973 L -0.39228999109751034, -0.9198415966266775 L -0.48970708168836735, -0.8718870191396719 M -0.48970708168836735, -0.8718870191396719 Q -0.1560937690698865, -0.12503893496650131 -0.9577508166849308, -0.28759932743201627L -0.9577508166849308, -0.28759932743201627 L -0.980574026109041, -0.19614938011705715 L -0.9946858239726537, -0.10295684332691478 L -0.9999608411799383, -0.008849638789810174 L -0.9963522145215319, 0.08533618586531373 L -0.9838920030069047, 0.1787638845490357 ", "type": "path" }, { "fillcolor": "rgba(166, 217, 106, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M -0.6779764105132204, 0.7350836597201772 Q -0.17629602479946838, -0.09444422502146564 0.236353638610496, -0.971667102209177L 0.236353638610496, -0.971667102209177 L 0.150151637722991, -0.9886629788199331 L 0.06279051952931194, -0.9980267284282717 M 0.06279051952931194, -0.9980267284282717 Q -0.18390555451029023, -0.07860500633078454 -0.6779764105132204, 0.7350836597201772L -0.6779764105132204, 0.7350836597201772 L -0.6779764105132204, 0.7350836597201772 L -0.6779764105132204, 0.7350836597201772 ", "type": "path" }, { "fillcolor": "rgba(217, 239, 139, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M -0.9482445112872268, -0.3175410946848432 Q -0.3561835105479488, -0.15884995062554869 -0.8698624690310782, -0.4932943188109473L -0.8698624690310782, -0.4932943188109473 L -0.9132910526870481, -0.4073075657065351 L -0.9482445112872268, -0.3175410946848432 ", "type": "path" }, { "fillcolor": "rgba(217, 239, 139, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M -0.8698624690310782, -0.4932943188109473 Q -0.09519033233426026, -0.17589428822475472 0.06279051952931194, -0.9980267284282717L 0.06279051952931194, -0.9980267284282717 L 0.06279051952931194, -0.9980267284282717 L 0.06279051952931194, -0.9980267284282717 M 0.06279051952931194, -0.9980267284282717 Q -0.07620712805007855, -0.18491207000723056 -0.74774820005775, -0.6639824013559359L -0.74774820005775, -0.6639824013559359 L -0.8132955640898473, -0.5818507759140459 L -0.8698624690310782, -0.4932943188109473 ", "type": "path" }, { "fillcolor": "rgba(166, 217, 106, 0.75)", "layer": "below", "line": { "color": "rgb(175,175,175)", "width": 0.5 }, "path": "M 0.8085771057522991, -0.5883902310994255 Q 0.11351569773986937, -0.03891254767591831 0.9995065603657315, -0.03141075907812925L 0.9995065603657315, -0.03141075907812925 L 0.9914285814422354, -0.13064979104245344 L 0.973521937261123, -0.22859360811569096 L 0.9459641478322448, -0.3242712306326526 L 0.909028411137388, -0.41673414516335955 L 0.8630808947440526, -0.5050657077329698 L 0.8085771057522991, -0.5883902310994255 ", "type": "path" }, { "fillcolor": "rgba(244, 109, 67, 0.75)", "layer": "below", "line": { "color": "rgb(150,150,150)", "width": 0.45 }, "path": "M 1.1, 0.0 L 1.0997655951500185, 0.022707613796388415 L 1.0990624805012257, 0.045405549820403415 L 1.0978909557145013, 0.06808413442424753 L 1.0962515200827398, 0.09073370220751736 L 1.0941448723180562, 0.11334460013650678 L 1.0915719102540018, 0.13590719165823945 L 1.0885337304629161, 0.1584118608074774 L 1.0850316277885774, 0.18084901630495556 L 1.081067094794353, 0.20320909564509498 L 1.0766418211270827, 0.22548256917145337 L 1.0717576927969663, 0.24765994413817516 L 1.0664167913737648, 0.2697317687557112 L 1.0606213930996546, 0.2916886362190827 L 1.0543739679191135, 0.31352118871697376 L 1.047677178426255, 0.33522012141994245 L 1.0405338787300547, 0.3567761864460525 L 1.0329471132379546, 0.37818019680223364 L 1.0249201153583685, 0.3994230302996921 L 1.0164563061226302, 0.4204956334417022 L 1.0075592927269832, 0.44138902528212165 L 0.9982328669952286, 0.4620943012529869 L 0.9884810037626837, 0.4826026369595566 L 0.9783078591821446, 0.5029052919411857 L 0.9677177689525739, 0.5229936133964288 L 0.956715246471265, 0.5428590398707815 L 0.9453049809102757, 0.5624931049054942 L 0.9334918352179462, 0.5818874406458959 L 0.921280844046356, 0.601033781407696 L 0.9086772116056028, 0.619923967199742 L 0.8956863094458166, 0.6385499472017307 L 0.8823136741678552, 0.6569037831953931 L 0.8685650050636575, 0.6749776529476875 L 0.8544461616872575, 0.6927638535445634 L 0.8399631613574979, 0.7102548046738706 L 0.8251221765935056, 0.7274430518560171 L 0.8099295324840206, 0.7443212696209991 L 0.7943917039917036, 0.7608822646304472 L 0.7785153131935667, 0.7771189787433601 L 0.7623071264587071, 0.793024492024218 L 0.745774051564543, 0.8085920256921945 L 0.7289231347527839, 0.8238149450102097 L 0.7117615577263888, 0.8386867621125927 L 0.6942966345887909, 0.8532011387701491 L 0.6765358087266955, 0.8673518890914553 L 0.6584866496377787, 0.8811329821592275 L 0.6401568497046377, 0.8945385446006415 L 0.62155422091637, 0.9075628630905104 L 0.6026866915391761, 0.9202003867862489 L 0.5835623027374076, 0.9324457296935915 L 0.5641892051464968, 0.9442936729620528 L 0.544575655399234, 0.9557391671091516 L 0.5247300126068668, 0.9667773341724545 L 0.504660734796525, 0.9774034697885167 L 0.4843763753064892, 0.9876130451978383 L 0.4638855791408384, 0.997401709174979 L 0.4217141628553076, 0.906728826522708 L 0.4403421593695356, 0.8978300410889438 L 0.45878248617865897, 0.8885486088986514 L 0.47702728418806073, 0.8788884856113222 L 0.49506877763566726, 0.8688537882810469 L 0.5128992774059061, 0.8584487936018661 L 0.5305111843067342, 0.8476779360850831 L 0.5478969923083419, 0.8365458061693172 L 0.5650492917421546, 0.8250571482641003 L 0.5819607724587615, 0.8132168587278559 L 0.5986242269434351, 0.8010299837811159 L 0.615032553387905, 0.7885017173558684 L 0.6311787587170825, 0.7756373988819537 L 0.6470559615694443, 0.7624425110114479 L 0.6626573952298035, 0.7489226772820088 L 0.6779764105132209, 0.7350836597201768 L 0.6930064785988246, 0.7209313563856526 L 0.7077411938123334, 0.7064717988576 L 0.7221742763560941, 0.6917111496640428 L 0.7362995749854732, 0.6766556996554537 L 0.7501110696304596, 0.6613118653236518 L 0.7636028739613617, 0.645686186067155 L 0.7767692378975067, 0.6297853214041484 L 0.7896045500578704, 0.6136160481342613 L 0.8021033401525955, 0.5971852574503573 L 0.8142602813143787, 0.5804999520015733 L 0.8260701923687297, 0.5635672429088563 L 0.8375280400421418, 0.5463943467342691 L 0.8486289411072238, 0.5289885824053598 L 0.859368164463887, 0.5113573680959038 L 0.8697411331556955, 0.49350821806434686 L 0.8797434263205216, 0.47544873945129884 L 0.8893707810746768, 0.45718662903744156 L 0.8986190943297123, 0.4387296699632332 L 0.9074844245411169, 0.42008572841180625 L 0.9159629933881666, 0.4012627502564742 L 0.9240511873842091, 0.3822687576742747 L 0.9317455594166986, 0.3631118457269928 L 0.9390428302163224, 0.34380017891112147 L 0.945939889754595, 0.3243419876782295 L 0.9524337985693228, 0.3047455649272204 L 0.9585217890173758, 0.2850192624699761 L 0.9642012664542313, 0.26517148747189334 L 0.9694698103397861, 0.24521069886882835 L 0.9743251752699692, 0.2251454037619774 L 0.9787652919337114, 0.2049841537922303 L 0.9827882679948664, 0.1847355414955409 L 0.9863923888987067, 0.16440819664086867 L 0.9895761186026509, 0.14401078255225216 L 0.9923381002309107, 0.1235519924165813 L 0.9946771566527783, 0.10304054557864252 L 0.9965922909843089, 0.08248518382501578 L 0.9980826870131829, 0.061894667658406836 L 0.9991477095465687, 0.0412777725640031 L 0.9997869046818348, 0.020643285269444013 L 1.0, 0.0 L 1.1 ,0.0", "type": "path" }, { "fillcolor": "rgba(253, 174, 97, 0.75)", "layer": "below", "line": { "color": "rgb(150,150,150)", "width": 0.45 }, "path": "M 0.4323275348193161, 1.0114805498065957 L 0.41130425246096874, 1.0202101802606773 L 0.3901048282580361, 1.0285029037245195 L 0.3687383409050884, 1.0363551688231998 L 0.34721394064181277, 1.0437636128089463 L 0.32554084533440814, 1.0507250630012397 L 0.30372833652801345, 1.057236538145521 L 0.2817857554718704, 1.063295249689919 L 0.2597224991189131, 1.068898602979453 L 0.23754801610150683, 1.0740441983671987 L 0.21527180268505078, 1.078729832241942 L 0.19290339870118606, 1.0829534979718802 L 0.17045238346234223, 1.086713386763965 L 0.14792837165938022, 1.0900078884385216 L 0.12534100924408018, 1.0928355921188126 L 0.10269996929824597, 1.0951952868352473 L 0.08001494789118721, 1.0970859620439826 L 0.05729565992736058, 1.09850680805969 L 0.03455183498594124, 1.0994572164023049 L 0.011793213154113635, 1.0999367800576094 L -0.010970459144141733, 1.0999452936515375 L -0.03372943332197133, 1.0994827535381257 L -0.05647396280450179, 1.0985493578010757 L -0.07919430720282757, 1.097145506168924 L -0.1018807364853534, 1.095271799843857 L -0.12452353514469715, 1.0929290412442465 L -0.14711300635837654, 1.09011823366101 L -0.16963947614149144, 1.0868405808279522 L -0.1920932974896261, 1.0830974864062617 L -0.21446485451019826, 1.078890553383391 L -0.23674456654048387, 1.0742215833865743 L -0.2589228922505544, 1.0690925759112762 L -0.28099033372936943, 1.0635057274649056 L -0.3029374405522756, 1.057463430626155 L -0.3247548138281701, 1.0509682730203755 L -0.3464331102245936, 1.0440230362114213 L -0.3679630459690298, 1.0366306945104384 L -0.38933540082469953, 1.0287944137021112 L -0.41054102203914594, 1.0205175496889085 L -0.4315708282639174, 1.0118036470539116 L -0.4524158134436726, 1.0026564375428406 L -0.47306705067304167, 0.9930798384659262 L -0.4935156960195904, 0.9830779510203143 L -0.5137529923112528, 0.9726550585337199 L -0.5337702728866047, 0.9618156246300846 L -0.5535589653063796, 0.9505642913180204 L -0.5731105950246337, 0.9389058770028605 L -0.5924167890179837, 0.9268453744231677 L -0.6114692793713729, 0.9143879485125852 L -0.6302599068188205, 0.9015389341879428 L -0.6487806242376436, 0.8883038340645693 L -0.6670235000946537, 0.8746883160997851 L -0.6849807218428493, 0.8606982111655915 L -0.702644599267157, 0.846339510551585 L -0.7200075677777785, 0.8316183633991785 L -0.654552334343435, 0.7560166939992531 L -0.6387678175155973, 0.7693995550468954 L -0.6227097471298629, 0.7824529192414468 L -0.6063850000860488, 0.7951711964543501 L -0.5898005674887669, 0.8075489400586993 L -0.5729635516534731, 0.8195808492617661 L -0.5558811630648843, 0.8312617713750774 L -0.5385607172890761, 0.8425867040210615 L -0.521009631840576, 0.8535507972753277 L -0.5032354230057996, 0.8641493557436549 L -0.4852457026241861, 0.8743778405728041 L -0.46704817482841166, 0.8842318713942907 L -0.44865063274508216, 0.8937072282002856 L -0.4300609551573106, 0.9027998531508419 L -0.4112871031306114, 0.9115058523116732 L -0.39233711660356124, 0.9198214973217378 L -0.3732191109446781, 0.9277432269899167 L -0.35394127347699955, 0.935267648820101 L -0.33451185997184524, 0.9423915404640348 L -0.3149391911132669, 0.949111851101292 L -0.2952316489347001, 0.955425702745796 L -0.27539767322934144, 0.9613303914783226 L -0.2554457579357904, 0.9668233886044595 L -0.23538444750050402, 0.9719023417375238 L -0.2152223332186217, 0.9765650758059765 L -0.19496804955472566, 0.9808095939849009 L -0.17463027044511464, 0.9846340785511469 L -0.15421770558317402, 0.9880368916617747 L -0.1337390966894332, 0.9910165760554636 L -0.11320321376790649, 0.9935718556765876 L -0.09261885135032126, 0.9957016362216882 L -0.07199482472984324, 0.9974050056081126 L -0.05133996618591071, 0.9986812343646142 L -0.030663121201792112, 0.9995297759437506 L -0.009973144676492483, 0.999950266955943 L 0.010721102867376032, 0.9999425273250994 L 0.031410759078128396, 0.9995065603657316 L 0.0520869635703278, 0.9986425527815362 L 0.0727408617192611, 0.9973508745854386 L 0.09336360845295087, 0.9956320789411338 L 0.11394637204007287, 0.9934869019261932 L 0.13448033787216382, 0.9909162622168377 L 0.15495671223849292, 0.9879212606945135 L 0.1753667260919873, 0.9845031799744366 L 0.1957016388045916, 0.980663483856311 L 0.21595274191046074, 0.9764038166974532 L 0.23611136283537554, 0.9717260027085936 L 0.25616886861079124, 0.9666320451726537 L 0.2761166695709213, 0.9611241255868374 L 0.2959462230312801, 0.9552046027283997 L 0.3156490369471025, 0.9488760116444965 L 0.33521667355008034, 0.9421410625665452 L 0.354640752961851, 0.9350026397495631 L 0.3739129567826988, 0.9274638002369794 L 0.39302503165392366, 0.9195277725514506 L 0.4323275348193161 ,1.0114805498065957", "type": "path" }, { "fillcolor": "rgba(254, 224, 139, 0.75)", "layer": "below", "line": { "color": "rgb(150,150,150)", "width": 0.45 }, "path": "M -0.7457740515645426, 0.808592025692195 L -0.7623466709064141, 0.7929864774117575 L -0.7785928138065192, 0.7770413311329372 L -0.7945055228226232, 0.7607634153955817 L -0.8100779833061977, 0.7441597012487063 L -0.8253035263208099, 0.7272372992651274 L -0.8401756314981058, 0.7100034564963463 L -0.8546879298301727, 0.6924655533689845 L -0.8688342063970766, 0.6746311005241029 L -0.8826084030284155, 0.6565077356007546 L -0.8960046208977417, 0.6381032199651514 L -0.9090171230487472, 0.6194254353868422 L -0.9216403368521239, 0.6004823806633327 L -0.9338688563920554, 0.5812821681945823 L -0.9456974447813088, 0.5618330205088551 L -0.9571210364039442, 0.5421432667414028 L -0.9681347390846721, 0.5222213390675012 L -0.9787338361839385, 0.5020757690913511 L -0.9889137886178343, 0.48171518419240383 L -0.9986702368019678, 0.46114830383066785 L -1.0079990025184633, 0.44038393581258517 L -1.016896090705293, 0.4194309725190695 L -1.025357691167169, 0.398298387097328 L -1.0333801802072666, 0.3769952296180914 L -1.0409601221790803, 0.35553062319990675 L -1.048094270957746, 0.333913760102142 L -1.0547795713301993, 0.31215389778838426 L -1.0610131603035777, 0.2902603549619111 L -1.0667923683313019, 0.26824250757494045 L -1.0721147204563146, 0.24610978481335982 L -1.0769779373709865, 0.2238716650586573 L -1.0813799363932324, 0.20153767182878937 L -1.0853188323584255, 0.1791173696997139 L -1.088792938426722, 0.15662036020934242 L -1.0918007668054541, 0.13405627774566328 L -1.0943410293862794, 0.11143478542079445 L -1.0964126382968162, 0.08876557093273985 L -1.0980147063665266, 0.06605834241661238 L -1.0991465475066502, 0.04332282428710488 L -1.099807677004021, 0.020568753073993442 L -1.0999978117286489, -0.0021941267475522296 L -1.0997168702549682, -0.024956066930058786 L -1.098964972896711, -0.04770731962845462 L -1.0977424416553803, -0.07043814157460541 L -1.0960498000823535, -0.09313879824988472 L -1.0938877730546708, -0.11579956805400184 L -1.091257286464603, -0.13841074646829762 L -1.0881594668231396, -0.16096265021172032 L -1.0845956407775557, -0.18344562138771167 L -1.0805673345432736, -0.20585003162021911 L -1.0760762732502587, -0.22816628617706627 L -1.0711243802042278, -0.2503848280789174 L -1.0657137760629916, -0.27249614219206886 L -1.0598467779282765, -0.294490759303328 L -1.053525898353424, -0.3163592601752179 L -0.9577508166849308, -0.28759932743201627 L -0.9634970708438877, -0.2677188720939345 L -0.9688307055118104, -0.2477237656291535 L -0.9737494365492979, -0.22762257098083394 L -0.9782511575002351, -0.2074238965246057 L -0.982333940493885, -0.18713639238201737 L -0.9859960370705051, -0.1667687467161015 L -0.9892358789301269, -0.14632968201065483 L -0.9920520786041845, -0.125827951334816 L -0.9944434300497006, -0.10527233459454712 L -0.996408909165776, -0.08467163477262246 L -0.9979476742321638, -0.0640346741587322 L -0.9990590662697372, -0.04337029057132238 L -0.9997426093226983, -0.022687333572780712 L -0.9999980106624079, -0.001994660679592936 L -0.9998251609127464, 0.018698866430903127 L -0.9992241340969547, 0.039384385715549884 L -0.9981951876059333, 0.0600530385605567 L -0.9967387620880146, 0.08069597357521803 L -0.9948554812602539, 0.1013043503825404 L -0.9925461516413219, 0.12186934340514843 L -0.989811762206111, 0.14238214564485674 L -0.986653483962205, 0.16283397245428535 L -0.983072669448393, 0.18321606529889942 L -0.9790708521554422, 0.20351969550787025 L -0.9746497458693769, 0.22373616801214527 L -0.9698112439375471, 0.24385682506812767 L -0.9645574184577979, 0.2638730499653737 L -0.9588905193910903, 0.28377627071671296 L -0.9528129735979509, 0.30355796372922 L -0.9463273837991639, 0.3232096574544607 L -0.9394365274611514, 0.3427229360164467 L -0.9321433556065171, 0.3620894428157527 L -0.9244509915502664, 0.381300884108245 L -0.9163627295622393, 0.4003490325568956 L -0.9078820334563342, 0.41922573075515257 L -0.899012535107122, 0.4379228947203671 L -0.8897580328944895, 0.45643251735577367 L -0.8801224900769745, 0.47474667187954656 L -0.8701100330944946, 0.4928575152194571 L -0.8597249498011897, 0.5107572913716864 L -0.8489716876291412, 0.5284383347223476 L -0.837854851683749, 0.5458930733303025 L -0.8263792027715883, 0.5631140321698566 L -0.8145496553615833, 0.5800938363319558 L -0.8023712754803777, 0.5968252141825041 L -0.7898492785427969, 0.6133010004764572 L -0.7769890271183387, 0.6295141394263495 L -0.7637960286346416, 0.6454576877239512 L -0.750275933018918, 0.6611248175137521 L -0.7364345302783615, 0.6765088193170057 L -0.7222777480205665, 0.6916031049050742 L -0.7078116489150175, 0.7064012101208519 L -0.69304242809674, 0.7208967976470523 L -0.6779764105132204, 0.7350836597201772 L -0.7457740515645426 ,0.808592025692195", "type": "path" }, { "fillcolor": "rgba(217, 239, 139, 0.75)", "layer": "below", "line": { "color": "rgb(150,150,150)", "width": 0.45 }, "path": "M -1.0430689624159495, -0.34929520415332754 L -1.035641456188567, -0.37073814778577185 L -1.0277731880782084, -0.39202330781160927 L -1.019467506765682, -0.4131416254130836 L -1.0107279470918464, -0.4340841127794266 L -1.001558228553208, -0.4548418569320109 L -0.9919622537189289, -0.47540602351764893 L -0.9819441065699192, -0.4957678605684353 L -0.9715080507607232, -0.5159187022265235 L -0.9606585278049385, -0.5358499724322547 L -0.9494001551849365, -0.5555531885740722 L -0.9377377243866948, -0.5750199650986594 L -0.9256761988605737, -0.5942420170797752 L -0.9132207119089054, -0.6132111637442621 L -0.9003765645012962, -0.631919331953726 L -0.8871492230185699, -0.6503585596404092 L -0.8735443169263148, -0.6685209991957907 L -0.8595676363790191, -0.6863989208104763 L -0.8452251297558249, -0.7039847157639498 L -0.8305229011289356, -0.7212708996627942 L -0.8154672076657664, -0.738250115625997 L -0.8000644569659372, -0.7549151374159881 L -0.7843212043342399, -0.7712588725140785 L -0.768244149990749, -0.787274365138985 L -0.7518401362192517, -0.8029547992071642 L -0.7351161444552197, -0.8182935012336912 L -0.7180792923145584, -0.8332839431724479 L -0.7007368305643983, -0.8479197451944152 L -0.6830961400372184, -0.8621946784028844 L -0.6651647284896145, -0.8761026674844322 L -0.6469502274070502, -0.889637793294533 L -0.6284603887559492, -0.9027942953767051 L -0.6097030816845088, -0.9155665744141238 L -0.5906862891736496, -0.9279491946126488 L -0.5714181046395103, -0.9399368860142632 L -0.5519067284889455, -0.9515245467399303 L -0.5321604646294905, -0.9627072451609185 L -0.5121877169352742, -0.9734802219976694 L -0.49199698567038824, -0.9838388923453129 L -0.4715968638712332, -0.9937788476249723 L -0.4509960336893812, -1.0032958574600248 L -0.4302032626965123, -1.0123858714765215 L -0.40922740015299675, -1.0210450210269963 L -0.3880773732417062, -1.0292696208369396 L -0.3667621832686762, -1.0370561705732213 L -0.3452909018321992, -1.0444013563338124 L -0.323672666962025, -1.0513020520581562 L -0.3019166792302736, -1.0577553208576 L -0.2800321978357356, -1.0637584162653133 L -0.25802853666322084, -1.0693087834051664 L -0.23591506031963358, -1.0744040600790672 L -0.21370118014845954, -1.079042077772297 L -0.19139635022436324, -1.0832208625764153 L -0.16901006332959864, -1.0869386360293414 L -0.14655184691394638, -1.0901938158722564 L -0.12403125903989763, -1.0929850167230006 L -0.10145788431480342, -1.0953110506656838 L -0.07884132981174252, -1.0971709277562527 L -0.056191220980803466, -1.0985638564438058 L -0.03351719755256993, -1.099489243907471 L -0.01082890943551281, -1.0999466963087066 L 0.011863987390943551, -1.0999360189589156 L 0.03455183498593975, -1.0994572164023049 L 0.03141075907812704, -0.9995065603657316 L 0.010785443082675955, -0.9999418354171958 L -0.009844463123193462, -0.999951542098824 L -0.030470179593245394, -0.999535676279519 L -0.051082928164366784, -0.9986944149489143 L -0.0716739361924932, -0.9974281161420478 L -0.09223444028618492, -0.9957373187869852 L -0.11275569003627056, -0.993622742475455 L -0.13322895173995125, -0.9910852871565967 L -0.15364551211781693, -0.9881260327539467 L -0.17399668202214838, -0.984746238705832 L -0.1942738001349632, -0.9809473434293609 L -0.21446823665421233, -0.9767309637082429 L -0.2345713969665644, -0.9720988940046966 L -0.25457472530521413, -0.9670531056957393 L -0.2744697083911578, -0.9615957462341818 L -0.29424787905638633, -0.9557291382346874 L -0.31390081984745377, -0.9494557784852838 L -0.3334201666078874, -0.9427783368847465 L -0.3527976120379147, -0.9356996553063087 L -0.37202490922999704, -0.9282227463881784 L -0.3910938751786475, -0.920350792251383 L -0.40999639426307377, -0.9120871431454771 L -0.428724421701121, -0.903435316022702 L -0.4472699869730802, -0.8943989930411934 L -0.4656251972138856, -0.8849820199978812 L -0.48378224057226404, -0.8751884046917441 L -0.5017333895354049, -0.8650223152181183 L -0.5194710042177365, -0.8544880781947847 L -0.5369875356124088, -0.8435901769205898 L -0.5542755288040989, -0.8323332494673852 L -0.571327626141772, -0.8207220867060955 L -0.5881365703700456, -0.8087616302677572 L -0.6046952077178314, -0.7964569704403929 L -0.6209964909429257, -0.7838133440026221 L -0.6370334823312711, -0.7708361319949228 L -0.6527993566495984, -0.757530857429498 L -0.6682874040501996, -0.7439031829397191 L -0.6834910329265924, -0.7299589083701492 L -0.6984037727188627, -0.7157039683081681 L -0.7130192766674908, -0.7011444295582532 L -0.7273313245144883, -0.6862864885599892 L -0.7413338251506967, -0.6711364687509063 L -0.7550208192081231, -0.6557008178752675 L -0.7683864815962044, -0.6399861052399544 L -0.7814251239809265, -0.6239990189186148 L -0.7941311972057407, -0.6077463629052642 L -0.8064992936532454, -0.5912350542185538 L -0.8185241495466329, -0.5744721199579327 L -0.8302006471899139, -0.5574646943129655 L -0.841523817145976, -0.5402200155270683 L -0.8524888403515406, -0.522745422816963 L -0.863091050168124, -0.5050483532491565 L -0.8733259343681259, -0.487136338574777 L -0.8831891370552029, -0.46901700202411223 L -0.8926764605181082, -0.4506980550622139 L -0.901783867017208, -0.43218729410695356 L -0.9105074805029164, -0.41349259721091897 L -0.9188435882653149, -0.3946219207085696 L -0.9267886425142562, -0.37558329583007594 L -0.9343392618892803, -0.35638482528328114 L -0.9414922328986971, -0.3370346798052471 L -0.9482445112872268, -0.3175410946848432 L -1.0430689624159495 ,-0.34929520415332754", "type": "path" }, { "fillcolor": "rgba(166, 217, 106, 0.75)", "layer": "below", "line": { "color": "rgb(150,150,150)", "width": 0.45 }, "path": "M 0.06906957148224314, -1.097829401271099 L 0.0915673366810486, -1.0961822033098054 L 0.11402659344829932, -1.0940740084594718 L 0.13643789659553252, -1.091505703316564 L 0.15879182110106924, -1.0884783679758667 L 0.18107896607368562, -1.0849932755762524 L 0.20328995870613584, -1.0810518917652647 L 0.22541545821686346, -1.0766558740827459 L 0.24744615977824952, -1.0718070712637593 L 0.2693727984297304, -1.0665075224611105 L 0.29118615297415934, -1.0607594563877851 L 0.3128770498557587, -1.0545652903796698 L 0.3344363670180376, -1.0479276293789455 L 0.35585503774005167, -1.0408492648385868 L 0.3771240544493915, -1.0333331735484217 L 0.3982344725102963, -1.0253825163832502 L 0.4191774139853001, -1.0170006369735451 L 0.4399440713688274, -1.0081910602992967 L 0.46052571129116965, -0.99895749120759 L 0.48091367819128317, -0.9893038128545403 L 0.501099397956866, -0.9792340850722399 L 0.5210743815301803, -0.9687525426614065 L 0.5408302284781054, -0.9578635936104475 L 0.5603586305249242, -0.946571817241688 L 0.5796513750463436, -0.9348819622855514 L 0.5987003485232986, -0.9227989448834892 L 0.6174975399540724, -0.9103278465205097 L 0.6360350442233059, -0.8974739118881716 L 0.6543050654264739, -0.8842425466789402 L 0.6722999201484366, -0.8706393153128371 L 0.6900120406946805, -0.8566699385973356 L 0.7074339782738956, -0.8423402913214882 L 0.7245584061305474, -0.8276563997852978 L 0.7413781226261266, -0.8126244392653719 L 0.7578860542677817, -0.797250731417923 L 0.7740752586830595, -0.7815417416202124 L 0.7899389275395061, -0.7655040762515474 L 0.8054703894078921, -0.7491444799149888 L 0.8206631125678681, -0.7324698326009194 L 0.8355107077548652, -0.7154871467936823 L 0.8500069308470849, -0.698203564522496 L 0.8641456854914499, -0.6806263543578902 L 0.8779210256674115, -0.6627629083549264 L 0.8913271581875348, -0.6446207389444847 L 0.9043584451338103, -0.6262074757739301 L 0.9170094062286669, -0.6075308624984808 L 0.9292747211396907, -0.5885987535246319 L 0.9411492317170775, -0.5694191107070036 L 0.9526279441628818, -0.5500000000000014 L 0.9637060311311461, -0.5303495880656972 L 0.9743788337580305, -0.510476138839359 L 0.9846418636210871, -0.490388010054072 L 0.9944908046268554, -0.4700936497259137 L 1.0039215148259863, -0.44960159260115734 L 1.0129300281551281, -0.4289204565670091 L 1.0215125561048457, -0.40805893902737206 L 1.02966548931287, -0.38702581324517393 L 1.037385399082006, -0.36582992465279196 L 1.0446690388220643, -0.34448018713212636 L 1.0515133454152061, -0.3229855792658883 L 1.057915440504132, -0.30135514056167745 L 1.0638726317025664, -0.27959796765043815 L 1.069382413727536, -0.25772321046089214 L 1.0744424694529593, -0.23574006837155836 L 1.0790506708841103, -0.21365778634197166 L 1.0832050800525406, -0.19148565102474221 L 1.0869039498310875, -0.16923298686007143 L 1.0901457246686248, -0.1469091521543812 L 1.092929041244246, -0.12452353514469966 L 1.095252729040606, -0.10208555005046005 L 1.097115810836179, -0.07960463311437234 L 1.0985175031162269, -0.057090238634033216 L 1.0994572164023046, -0.03455183498594316 L 0.9995065603657315, -0.03141075907813014 L 0.9986522755602061, -0.05190021694003019 L 0.9973780098510717, -0.07236784828579303 L 0.9956842991278236, -0.09280504550041822 L 0.9935718556765872, -0.11320321376790878 L 0.9910415678805679, -0.13355377468580107 L 0.988094499846443, -0.1538481698727922 L 0.984731890956855, -0.17407786456794747 L 0.9809551553491911, -0.19423435121997423 L 0.9767658813208719, -0.21430915306505305 L 0.9721658306613963, -0.2342938276917201 L 0.967156937911424, -0.25417997059130737 L 0.9617413095492109, -0.273959218692434 L 0.9559212231047328, -0.29362325387808025 L 0.9496991262018765, -0.3131638064837512 L 0.9430776355290963, -0.3325726587752654 L 0.9360595357389726, -0.35184164840470356 L 0.9286477782771324, -0.3709626718430655 L 0.9208454801410255, -0.3899276877881901 L 0.9126559225690783, -0.40872872054650666 L 0.9040825496607775, -0.4273578633871943 L 0.8951289669282609, -0.44580728186733815 L 0.8857989397800277, -0.46406921712669 L 0.8760963919374054, -0.48213598915063377 L 0.8660254037844379, -0.5000000000000012 L 0.8555902106518886, -0.5176537370063669 L 0.8447952010360824, -0.5350897759314834 L 0.8336449147533335, -0.5523007840895279 L 0.8221440410307366, -0.5692795234308455 L 0.8102974165341225, -0.5860188535858951 L 0.7981100233340104, -0.6025117348681148 L 0.785586986810409, -0.6187512312344456 L 0.7727335734973498, -0.634730513202269 L 0.7595551888680593, -0.6504428607215293 L 0.7460573750616982, -0.6658816660008358 L 0.7322458085526291, -0.6810404362863534 L 0.7181262977631874, -0.6959127965923158 L 0.7037047806209631, -0.7104924923820112 L 0.6889873220616196, -0.7247733921981118 L 0.6739801114782968, -0.7387494902412471 L 0.6586894601186795, -0.7524149088957253 L 0.6431217984308142, -0.7657639012013528 L 0.6272836733588004, -0.7787908532703051 L 0.6111817455894878, -0.7914902866480337 L 0.5948227867513399, -0.8038568606172183 L 0.5782136765666417, -0.8158853744437923 L 0.5613613999582476, -0.8275707695640997 L 0.5442730441120895, -0.8389081317122629 L 0.5269557954966759, -0.8498926929868649 L 0.5094169368408401, -0.86051983385608 L 0.49166384407100483, -0.8707850851004068 L 0.4737039832092547, -0.8806841296921877 L 0.4555449072335145, -0.8902128046111271 L 0.4371942529011665, -0.8993671025950365 L 0.4186597375374269, -0.9081431738250818 L 0.3999491557898431, -0.9165373275448152 L 0.3810703763502728, -0.9245460336123137 L 0.3620313386457239, -0.9321659239847728 L 0.3428400494994468, -0.9393937941349287 L 0.3235045797636833, -0.9462266043987152 L 0.3040330609254887, -0.9526614812535867 L 0.28443368168705335, -0.9586957185269724 L 0.264714684521963, -0.9643267785343501 L 0.24488436220884577, -0.969552293146464 L 0.22495105434386317, -0.9743700647852357 L 0.2049231438335122, -0.9787780673479508 L 0.18480905336921438, -0.9827744470593316 L 0.16461724188516874, -0.9863575232511383 L 0.14435620100097202, -0.9895257890689696 L 0.12403445145048408, -0.9922779121059672 L 0.10366053949845393, -0.9946127349631562 L 0.08324303334640781, -0.9965292757361867 L 0.06279051952931194, -0.9980267284282717 L 0.06906957148224314 ,-1.097829401271099", "type": "path" } ], "showlegend": false, "title": "Chord diagram", "width": 400, "xaxis": { "visible": false }, "yaxis": { "visible": false } } }, "text/html": [ "
" ], "text/vnd.plotly.v1+html": [ "