Skip to content

Instantly share code, notes, and snippets.

@heronshoes
Created September 10, 2022 12:16
Show Gist options
  • Save heronshoes/fa71a9bd9602e69c80ffb0c2d77dbb00 to your computer and use it in GitHub Desktop.
Save heronshoes/fa71a9bd9602e69c80ffb0c2d77dbb00 to your computer and use it in GitHub Desktop.
Top 50 Software Startups
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "22088a38-5b54-4b49-9747-a126378241ac",
"metadata": {},
"source": [
"## 74. Top 50 Software Startups\n",
"\n",
"https://charliereese.ca/y-combinator-top-50-software-startups/"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "30dad083-eb6f-4a6b-8ca7-9a7de73deff1",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"RedAmber::DataFrame <50 x 9 vectors> <table><tr><th>company</th><th>value_MMUSD</th><th>language</th><th>lang_2</th><th>lang_3</th><th>lang_4</th><th>dataSci</th><th>lowlev</th><th>description</th></tr><tr><td>Stripe</td><td>36000</td><td>Ruby</td><td><i>(nil)</i></td><td><i>(nil)</i></td><td><i>(nil)</i></td><td>false</td><td>false</td><td>Payment, economic infrastructure for internet</td></tr><tr><td>Cruise</td><td>19000</td><td>C++</td><td>Python</td><td><i>(nil)</i></td><td><i>(nil)</i></td><td>true</td><td>false</td><td>Building self-driving car tech</td></tr><tr><td>Airbnb</td><td>18000</td><td>Ruby</td><td><i>(nil)</i></td><td><i>(nil)</i></td><td><i>(nil)</i></td><td>false</td><td>false</td><td>Marketplace to rent someone’s room</td></tr><tr><td>DoorDash</td><td>16000</td><td>Python</td><td><i>(nil)</i></td><td><i>(nil)</i></td><td><i>(nil)</i></td><td>false</td><td>false</td><td>Food delivery</td></tr><tr><td colspan='9'>&#8942;</td></tr><tr><td>Xendit</td><td>150</td><td>JS</td><td><i>(nil)</i></td><td><i>(nil)</i></td><td><i>(nil)</i></td><td>false</td><td>false</td><td>Digital payments</td></tr><tr><td>EasyPost</td><td>150</td><td>Ruby</td><td><i>(nil)</i></td><td><i>(nil)</i></td><td><i>(nil)</i></td><td>false</td><td>false</td><td>Logistics software</td></tr><tr><td>Newfront</td><td>150</td><td>JS</td><td>Go</td><td><i>(nil)</i></td><td><i>(nil)</i></td><td>false</td><td>false</td><td>Insurance platform</td></tr></table>"
],
"text/plain": [
"#<RedAmber::DataFrame : 50 x 9 Vectors, 0x000000000000f7e4>\n",
" company value_MMUSD language ... description\n",
" <string> <uint16> <string> ... <string>\n",
" 1 Stripe 36000 Ruby ... Payment, economic infrastructure for internet\n",
" 2 Cruise 19000 C++ ... Building self-driving car tech\n",
" 3 Airbnb 18000 Ruby ... Marketplace to rent someone’s room\n",
" 4 DoorDash 16000 Python ... Food delivery\n",
" 5 Twitch 15000 C++ ... Gaming video platform, community\n",
" : : : : ... :\n",
"48 Xendit 150 JS ... Digital payments\n",
"49 EasyPost 150 Ruby ... Logistics software\n",
"50 Newfront 150 JS ... Insurance platform\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"require 'red-amber'\n",
"\n",
"source = <<-SOURCE\n",
"company\tdescription\tvalue_MMUSD\tlanguage\tdataSci\tlowlev\n",
"Stripe\tPayment, economic infrastructure for internet\t36,000\tRuby\tN\tN\n",
"Cruise\tBuilding self-driving car tech\t19,000\tC++, Python\tY\tN\n",
"Airbnb\tMarketplace to rent someone’s room\t18,000\tRuby\tN\tN\n",
"DoorDash\tFood delivery\t16,000\tPython\tN\tN\n",
"Twitch\tGaming video platform, community\t15,000\tC++, Ruby\tN\tY\n",
"Instacart\tGrocery pick-up, delivery\t13,700\tRuby\tN\tN\n",
"Dropbox\tFile hosting, syncing\t8000\tPython\tN\tY\n",
"Coinbase\tCryptocurrency exchange\t8,000\tRuby\tN\tN\n",
"Gusto\tEmployee payroll and benefits\t3,800\tRuby\tN\tN\n",
"Rappi\tOn-demand delivery\t3,500\tGo, Node, Python, Java\tN\tN\n",
"Flexport\tFreight forwarding platform\t3,200\tRuby\tN\tN\n",
"Reddit\tOnline network of communities\t3,000\tLisp\tN\tN\n",
"GitLab\tDevOps platform\t2,750\tRuby\tN\tN\n",
"Brex\tCorporate credit cards\t2,750\tElixir\tN\tN\n",
"PargerDuty\tSaaS incident response platform\t2,270\tRuby\tN\tN\n",
"Checkr\tBackground checks\t2,200\tRuby\tN\tN\n",
"Podium\tInteraction management platform\t1,500\tRuby\tN\tN\n",
"Segment\tCustomer data platform\t1,500\tGo, JS\tN\tN\n",
"Docker\tBuild, deliver software in containers\t1000\tGo\tN\tY\n",
"Scale\tTraining, validation data for ML\t1,000\tPython, JS,\tY\tN\n",
"Amplitude\tProduct, customer analytics\t1,000\tPython, Java\tY\tN\n",
"Zapier\tConnect apps and automate workflows\t1000\tPython\tN\tN\n",
"Faire\tB2B wholesale marketplace\t1,000\tJava\tN\tN\n",
"PlanGrid\tConstruction software\t875\tPython\tN\tN\n",
"Mixpanel\tUser analytics\t865\tPython\tY\tN\n",
"Benchling\tBiotech research\t850\tPython\tY\tN\n",
"Meesho\tSocial commerce platform\t700\tJava\tN\tN\n",
"Optimizely\tDigital experience optimization, testing\t600\tPython\tY\tN\n",
"Algolia\tSearch service\t578\tC++, Ruby\tN\tY\n",
"Goat\tSneaker marketplace\t550\tRuby\tN\tN\n",
"StandardCognition\tAutonomous checkout\t535\tPython\tY\tN\n",
"People.ai\tIntelligent CRM\t500\tPython\tY\tN\n",
"Razorpay\tDigital payments\t450\tPHP\tN\tN\n",
"EquipmentShare\tEquipment rentals\t400\tPython\tN\tN\n",
"Weebly\tWebsite builder\t365\tPHP\tN\tN\n",
"Webflow\tWebsite builder\t350\tJS\tN\tN\n",
"Matterport\t3D technology platform\t325\tC++\tN\tY\n",
"InfluxData\tInfluxDB creator\t300\tGo\tN\tY\n",
"Embark\tSelf-driving trucks\t300\tPython, C++\tY\tY\n",
"SendBird\tChat, calls as a service\t300\tPython\tN\tN\n",
"Rescale\tCloud simulation platform\t300\tJava, Python\tY\tN\n",
"GoCardless\tDirect debit payments\t300\tRuby\tN\tN\n",
"Rigetti Computing\tQuantum computing\t300\tPython, Lisp C\tY\tY\n",
"MessageBird\tOmnichannel customer communication\t300\tGo, PHP, Python, Java\tN\tN\n",
"Ironclad\tDigital contracting platform\t300\tJS, Java\tN\tN\n",
"Sift\tDigital safety and fraud detection\t300\tJava, Ruby\tY\tN\n",
"Mattermost\tOpen Slack alternative\t250\tGo\tN\tN\n",
"Xendit\tDigital payments\t150\tJS\tN\tN\n",
"EasyPost\tLogistics software\t150\tRuby\tN\tN\n",
"Newfront\tInsurance platform\t150\tJS, Go\tN\tN\n",
"SOURCE\n",
"\n",
"require 'tempfile'\n",
"\n",
"file = Tempfile.new([\"T50SS\", \".tsv\"])\n",
"file.puts(source)\n",
"file.close\n",
"\n",
"df = RedAmber::DataFrame.load(file.path)\n",
" .assign(:value_MMUSD) { # delete comma\n",
" v(:value_MMUSD).each.map { |val| val.gsub(/,/, '').to_i } \n",
" }\n",
" .assign(:language, :lang_2, :lang_3, :lang_4) { # languages\n",
" assigner =\n",
" language.each.with_object([]) do |l, a|\n",
" l1, l2, l3, l4 = l.split(/,\\s*/)\n",
" a << [l1, l2, l3, l4]\n",
" end\n",
" assigner.transpose\n",
" }\n",
" .assign(:dataSci) { dataSci == \"Y\" }\n",
" .assign(:lowlev) { lowlev == \"Y\" }\n",
" .pick(0, 2, 3, 6, 7, 8, 4, 5, 1) # change the order of columns"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "95592c0b-dc08-401a-be48-c6ead7dd924c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"RedAmber::DataFrame <9 x 4 vectors> <table><tr><th>language</th><th>count</th><th>total_sum($BN)</th><th>ratio_%</th></tr><tr><td>Ruby</td><td>13</td><td>92.4</td><td>52.3</td></tr><tr><td>Python</td><td>11</td><td>29.9</td><td>16.9</td></tr><tr><td>Lisp</td><td>1</td><td>3.0</td><td>1.7</td></tr><tr><td>Elixir</td><td>1</td><td>2.8</td><td>1.6</td></tr><tr><td colspan='4'>&#8942;</td></tr><tr><td>PHP</td><td>2</td><td>0.8</td><td>0.5</td></tr><tr><td>JS</td><td>2</td><td>0.5</td><td>0.3</td></tr><tr><td>C++</td><td>1</td><td>0.3</td><td>0.2</td></tr></table>"
],
"text/plain": [
"#<RedAmber::DataFrame : 9 x 4 Vectors, 0x000000000000f924>\n",
" language count total_sum($BN) ratio_%\n",
" <string> <int64> <double> <double>\n",
"1 Ruby 13 92.4 52.3\n",
"2 Python 11 29.9 16.9\n",
"3 Lisp 1 3.0 1.7\n",
"4 Elixir 1 2.8 1.6\n",
"5 Go 3 1.6 0.9\n",
"6 Java 2 1.7 1.0\n",
"7 PHP 2 0.8 0.5\n",
"8 JS 2 0.5 0.3\n",
"9 C++ 1 0.3 0.2\n"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Startups with one (initial) primary back-end language:\n",
"one_primary =\n",
" df.slice(df.lang_2.is_nil)\n",
" .group(:language) {\n",
" [count(:language), sum(:value_MMUSD)]\n",
" }\n",
" .assign(:\"total_sum($BN)\") {\n",
" (v(:\"sum(value_MMUSD)\") / 1000.0).round(n_digits: 1)\n",
" }\n",
" .assign(:\"ratio_%\") {\n",
" (v(:\"total_sum($BN)\") / df.value_MMUSD.sum * 1000 * 100).round(n_digits: 1)\n",
" }\n",
" .drop(:\"sum(value_MMUSD)\")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "87d40e85-c7f2-4078-8dcd-eac396daba8a",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"data": [
{
"error_y": {
"array": [
null,
null,
null,
null,
null,
null,
null,
null,
null
],
"arrayminus": [
null,
null,
null,
null,
null,
null,
null,
null,
null
],
"color": "#424242",
"symmetric": false,
"type": "data",
"visible": true
},
"marker": {
"color": [
"#1f77b4",
"#ff7f0e",
"#2ca02c",
"#d62728",
"#9467bd",
"#8c564b",
"#e377c2",
"#7f7f7f",
"#bcbd22"
]
},
"orientation": "v",
"type": "bar",
"width": 0.8,
"x": [
0,
1,
2,
3,
4,
5,
6,
7,
8
],
"y": [
92.4,
29.9,
3,
2.8,
1.6,
1.7,
0.8,
0.5,
0.3
]
}
],
"layout": {
"autosize": true,
"showlegend": false,
"xaxis": {
"range": [
-0.5,
8.5
],
"tickmode": "array",
"ticktext": [
"Ruby",
"Python",
"Lisp",
"Elixir",
"Go",
"Java",
"PHP",
"JS",
"C++"
],
"tickvals": [
0,
1,
2,
3,
4,
5,
6,
7,
8
],
"title": {
"text": "language"
},
"type": "linear"
},
"yaxis": {
"autorange": true,
"range": [
0,
97.26315789473685
],
"title": {
"text": "total_sum($BN)"
},
"type": "linear"
}
}
},
"image/png": "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QAABBEIWIDwFCE54ChCXTSOAAAIIIIAAAgggELIA4SlAcMJTgLhsGgEEEEAAAQQQQACBkAUIT/nAV61aZXXq1LGcnJyfNcOWLVtsz549Vr16dc9NRHjyTEVBBBBAAAEEEEAAAQQiL0B4MrNJkybZ9OnTbf/+/bZv3z4799xzrX///q7xtm/fbgMHDrSlS5e6/9euXdtGjhxpNWvWTNi4hKeERBRAAAEEEEAAAQQQQCBtBLI+PH366afWr18/Gz58uJ1++un25Zdf2vXXX29//vOf7cQTT7QJEybYzJkzbdy4cVahQgXr06ePNWjQwIYNG5awkQlPCYkogAACCCCAAAIIIIBA2ghkfXh6//337Y477nAhqWHDhq7hLrzwQheg2rdvb507d7aWLVtajx493O9mz57tep7mzJlzyOF9+Vue8JQ2rwMqigACCCCAAAIIIIBAQoGsD0+7d+92QWn16tXWqVMn27Ztm82dO9eFqSpVqljbtm2tb9++7m8tixcvdv+fNm2aVa1atVBgwlPC848CCCCAAAIIIIAAAgikjUDWhye11Pjx4+21116zMmXK2Lp16+yCCy6wm2++2UqUKGHnn3++DR482Fq1auUadcWKFdazZ093n1TdunVtx44dcRt7xsI1dtuMJWlzMiSjoq0a17AxnZonY1NsAwEEEEAAAQQQQCDJAuXLl0/yFrNrc1kfnt588013/9Lzzz/veprefvttd/9T165dXU+Uepx0T1SbNm3cmVGw52nnzp3xw9OC1TYoC8PT2M4nZNeriKNFAAEEEEAAAQTSRKBcuXJpUtNoVjPrw9OoUaPs3Xffteeeey6vhTQphCaHGDFihLvnSb1O3bt3d7/nnqfCT+TWzXJtYtcW0TzbqRUCCCCAAAIIIIAAAsUQiGx4OnDgQMIJGYpx3Hmrvvzyy/bwww/bkCFD7Oyzz7aVK1fa73//e9fr1K1bNzekb9asWe5vBarevXsz214h8ISnZJyVbAMBBBBAAAEEEEAgigKRCE979+61V1991T777DNbtmyZffvtt+55S7qnqFGjRtakSRN3H1KlSpWSbqiQNnbsWDd7nobg6b4nPedJvU+lSpWyrVu32oABA2z58uVu37Vq1TL1VunvRAsTRiQS4vcIIIAAAggggAACCKSPQMrD04IFC+y+++6zDRs2WL169axFixZWp04d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/K30n9IzRtxtX8z/oEjr+llp8979tmRb/J7LKqVK2LEV4/d8+tlXorJte/Wz485pnahYyn//6quv2tq1a+PW4/zzz3ejS1gQQACBwgQITwnOj7Zt21rfvn1Nf2tZvHix+/+0adOsatWqhKcCAq2b5drEri2K9qojPPl2o+fJH1mYw/b81Sy40sUNT4/d+M/gKhfRLd8wumXkw1OU6IoTnrZ/tNb2bdodyuHcPvl+W/zNv4fgH2oZ3mWQ/fKIpqHUpXKr+qHspzg7yZTe4OIY+FmXiZX8aKV3WcJTIe134MAB05WowYMHW6tWrVxJzaDVs2dP05tK3bp1Cx1msmBjWfv7quyaTatJ5d12Vf0tRXpVlDywx6766pYirZvOKz1z5Ejbl1O0K8R/P/B3+8Li3/eQzi7x6t4up50dZ8cV6dBqLFpkR770cpHWTdeVNjY6xpZ37Fi06u/PsS3vZ99wrMpnfG9W4kCRzDb9623bvXZVkdZN15Uqn3CalavXsEjVr72xkh27KvE9xEXaeIGV3vphgf2wa2PcTZ1V40SrUbZaMnZV6DZ+qLzdPqkfvwessJX1veTbb78NvI7awddff+3+xFsaNmxo+hPGotslEo32iVePChU/spyc4AP6999vtxdmrIzLUbduBetwaTiheffuBrZnd924ddEwaJaiCxCeEtipx6lfv3550zAX7HkqbIx+0ZuFNRFAAAEEEEAAAQQQSL4A4al4poSnBH6650m9Tt27d3cl/dzzVLymYW0EEEAAAQQQQAABBBCIkgDhKUFrjB8/3mbNmmX6W7Pt9e7d2/Nse1FqaOqCAAIIIIAAAggggAACxRMgPCXw07M0BgwYYMv/87DLWrVq2ahRo0x/R3356aef7L333rN27dpFvaoprR9Oifn3799vO3fudBcQWAoXUO/0aaedZocffrgzK1mypJUu5HlP2poewL13714rX7581vLq+H/44Qc3EU82O2TtCcCBp42A7rtat26dValSJStfqzr+9evXu8/DSpWy6772tDlJA64o4ckj8KZNm2z37t2eHo7rcZOeirVv39527NjhyupLWNOmTd0EFl7C2yeffGL9+/f3NK26p8pEqNDKlSutW7dueTXSAyEvueQSu/baaxPWUg89/v3vf2+NGzd2ZTPZKSFGgQI63+TaoUOHg37z7rvv2tChQ+3ZZ5+1ww47zO9mM6r8HXfcYe+///7PjunBBx+05s2b23nnnWf33nuvnXrqqe65RMcee6x70HZhy+jRo+3tt9+2qVOnZpSVl4PRfaQPPPCAfffdd3nFq1evbldddZXpfMzWRQ9mv/HGG/Pe+1955ZVspfB13C+88II98sgjeevos/L666+3s88+22KfG0888YTVr///N+7feeed7vNdr9vifLb4qmjEC+t+73379rlajhkzxho1amQbNmxwtvPmzXNeWhSgbrnlFjvzzDMjfkTFr54upj/00EM2d+7/P1JBx6/3+Wx+ryq+bPptgfAU8TbTC1JfZDXrn670/OlPfzJ9sRg7dmzCmmdyKIh9wOnDrmbNmvavf/3LPchYwyoLfvEvCKUvt8OHD7fTTz+d8OQxPOlDQ7MuNWvWzIX4bF4UnjZv3uweWZB/0eybZcuWPSg8ffnll+7qZKJnx+jZM1u2bLFjjjkmq2hjE/Cce+657sKHXsurV692DyZftGjRQV+CswrGzHR1e9u2bfa///u/9thjjxnhydsZoPCkYfZ6wL38nn/+eXv99dfd//XepYtDhwpP6iW+//7788JTUT5bvNUwPUrpPV+9K3rGZSw8KSTps1cX0o4++mj7/vvv7eWXX7bc3Fzr1KlTehxYMWopix9//NGGDBlixx13nPtOpveqzz77zIWq/Ms777xjH330Ud4FkHi71blYr1499x2PJX0ECE8Rb6uCPQHPPPOMTZkyxb1gteiKmYYIxYbm/eMf/zA9CFAhKxaeLr30UvfBqytFl112mZv8QleO9IaoEBYbivXPf/7TbVshpKhTgobFeagriH369HG9IkcddZTpS+uwYcPyqvPoo4/arl273BcSWainSn8uuugi9yaoHjpNDqIPXi2//e1v3R8tGrKmD16Zy/DEE0+0QYMGWbVq1dxwTn2QKJAdat2wPJK1n3g9T1988YX98Y9/tMmTJ1uJEiVM5+Hf//539+VEYV7nlCZWue+++1xVFLTUBgoUagdNM5spi8KTziMF8EMt+Xue9DrUl4wLL7zQha2TTz7ZXQXXoteqHnmgXhe9HvVBK2MtXbp0cWFCvVE6x/Q613YybdExatiLet4KLupx1/C9wl5/meZxqOPR+7mGisfCk3oxP/30U/depPcg9aKrl0BfwjSFtc6V2KLQpdeo3t/irZdphrHwFPuM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AAEEEEiuAOEpuZ5sDQEEEEAAAQQQQAABBDJUgPCUoQ3LYSGAAAIIIIAAAggggEByBQhPyfVkawgggAACCCCAAAIIIJChAoSnDG1YDgsBBBBAAAEEEEAAAQSSK0B4Sq4nW0MAAQQQQAABBBBAAIEMFSA8ZWjDclgIIIAAAggggAACCCCQXAHCU3I92RoCCCCAAAIIIIAAAghkqADhKUMblsNCAAEEEEAAAQQQQACB5AoQnpLrydYQQAABBBBAAAEEEEAgQwUITxnasBwWAggggAACCCCAAAIIJFeA8JRcT7aGAAIIIIAAAggggAACGSpAeMrQhuWwEEAAAeTQWP8AAAjMSURBVAQQQAABBBBAILkChKfkerI1BBBAAAEEEEAAAQQQyFABwlOGNiyHhQACCCCAAAIIIIAAAskVIDwl15OtIYAAAggggAACCCCAQIYKEJ4ytGE5LAQQQAABBBBAAAEEEEiuAOEpuZ5sDQEEEEAAAQQQQAABBDJUgPCUoQ3LYSGAAAIIIIAAAggggEByBQhPyfVkawgggAACCCCAAAIIIJChAoSnDG1YDgsBBBBAAAEEEEAAAQSSK0B4Sq4nW0MAAQQQQAABBBBAAIEMFSA8ZWjDclgIIIBAcQUWLlxoDzzwgI0cOdJq1qxZ3M2xPgIIIIAAAmkvQHhK+ybkABBAAIFgBN5++22766677IknnrD69esHsxO2igACCCCAQBoJEJ7SqLGoKgIIIBCmAOEpTG32hQACCCCQDgKEp3RoJeqIAAIIpECgYHh655137NFHH7UNGzbYvn37rHr16tapUyfr0KGDq92OHTvshhtusLZt29pHH31kixYtsjp16thvf/tba9OmTd4RfPbZZ24o4Ndff21lypSxRo0a2U8//WSPP/64lS5d2vV0ffnllzZ8+PC8daZPn26vv/66PfLII+5nKjNz5kzbtm2b+3+DBg2sV69eduKJJ3rejwq++eabNnHiRFu1apVVrFjRzjvvPLv++uutVKlSKRBnlwgggAACURcgPEW9hagfAgggkCKBguFp9uzZNm/ePBdQypUrZ2+88YYLSffff7+dcsoptmXLFvvNb37janvSSSe5cm+99ZatWLHCnn/+eatSpYoLKV27dnWhSaFLAezFF190P3/ppZfcdu+++25bunSpTZkyJe/Ix44day+88IK98sor7mcP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",
"text/html": [
"<div>\n",
" \n",
" \n",
" <div id=\"c94766c7-0f74-442b-b1fe-b4e6aa046113\" class=\"plotly-graph-div\" style=\"height: 525px; width: 100%;\"></div>\n",
" <script type=\"text/javascript\">\n",
" require([\"plotly\"], function (Plotly) {\n",
" window.PLOTLYENV = window.PLOTLYENV || {};\n",
" window.PLOTLYENV.BASE_URL = 'https://plot.ly';\n",
" if (document.getElementById(\"c94766c7-0f74-442b-b1fe-b4e6aa046113\")) {\n",
" Plotly.newPlot(\"c94766c7-0f74-442b-b1fe-b4e6aa046113\", [{\"type\":\"bar\",\"orientation\":\"v\",\"x\":[0,1,2,3,4,5,6,7,8],\"y\":[92.4,29.9,3.0,2.8,1.6,1.7,0.8,0.5,0.3],\"width\":\"4/5\",\"marker\":{\"color\":[\"#1f77b4\",\"#ff7f0e\",\"#2ca02c\",\"#d62728\",\"#9467bd\",\"#8c564b\",\"#e377c2\",\"#7f7f7f\",\"#bcbd22\"]},\"error_y\":{\"type\":\"data\",\"visible\":true,\"symmetric\":false,\"array\":[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN],\"arrayminus\":[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN],\"color\":\"#424242\"}}], {\"showlegend\":false,\"xaxis\":{\"title\":\"language\",\"tickmode\":\"array\",\"tickvals\":[0,1,2,3,4,5,6,7,8],\"ticktext\":[\"Ruby\",\"Python\",\"Lisp\",\"Elixir\",\"Go\",\"Java\",\"PHP\",\"JS\",\"C++\"],\"range\":[-0.5,8.5]},\"yaxis\":{\"title\":\"total_sum($BN)\"}}, {}).then(function(){ var gd = document.getElementById('c94766c7-0f74-442b-b1fe-b4e6aa046113');\n",
"var x = new MutationObserver(function (mutations, observer) {\n",
" var display = window.getComputedStyle(gd).display;\n",
" if (!display || display === 'none') {\n",
" console.log([gd, 'removed']);\n",
" Plotly.purge(gd);\n",
" observer.disconnect();\n",
" }\n",
"});\n",
"\n",
"// Listen for the removal of the full notebook cell\n",
"var notebookContainer = gd.closest('#notebook-container');\n",
"if (notebookContainer) {\n",
" x.observe(notebookContainer, {childList: true});\n",
"}\n",
"\n",
"// Listen for the clearing of the current output cell\n",
"var outputEl = gd.closest('.output');\n",
"if (outputEl) {\n",
" x.observe(outputEl, {childList: true});\n",
"}\n",
" });\n",
"}\n",
"\n",
" });\n",
" </script>\n",
"</div>"
],
"text/plain": [
"#<Charty::Plotters::BarPlotter:0x000000000000f974>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"require 'charty'\n",
"Charty::Backends.use(:plotly)\n",
"\n",
"Charty.bar_plot(data: one_primary.table, x: :language, y: :\"total_sum($BN)\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Ruby 3.1.1",
"language": "ruby",
"name": "ruby"
},
"language_info": {
"file_extension": ".rb",
"mimetype": "application/x-ruby",
"name": "ruby",
"version": "3.1.1"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment