Why isn't XPlot.GoogleCharts.Chart.Map producing tooltips? - f#

I'm trying to plot locations on a map with XPlot and googlecharts.chart.map.
I followed the example I found, but the resulting map had no tool tips on the specified locations.
To debug my code I simply attempted to reproduce the example, with the same result, i.e. no markers at the specified locations.
My implementation of the example (https://fslab.org/XPlot/chart/google-map-chart.html) is below:
let data =
[
"China", "China: 1,363,800,000"
"India", "India: 1,242,620,000"
"US", "US: 317,842,000"
"Indonesia", "Indonesia: 247,424,598"
"Brazil", "Brazil: 201,032,714"
"Pakistan", "Pakistan: 186,134,000"
"Nigeria", "Nigeria: 173,615,000"
"Bangladesh", "Bangladesh: 152,518,015"
"Russia", "Russia: 146,019,512"
"Japan", "Japan: 127,120,000"
]
let options = XPlot.GoogleCharts.Configuration.Options(showTip = true)
let chart = data
|> XPlot.GoogleCharts.Chart.Map
|> XPlot.GoogleCharts.Chart.WithOptions options
|> XPlot.GoogleCharts.Chart.WithHeight 420
|> XPlot.GoogleCharts.Chart.WithWidth 800
chart |> XPlot.GoogleCharts.Chart.Show
The map is shown without any markers.
How should the code be modified to ensure the locations are marked?

The missing tooltips problem source is not in your code, but in the ambient environment.
If you use your F# console charting app code without any changes, but bind it with nuget package XPlot.GoogleCharts ver 1.4.2 instead of the latest at the moment XPlot.GoogleCharts ver 1.5.0, it will work as expected, i.e. tooltips will be present even on the html static page viewed in the browser.
The regression, I believe, has nothing to do with XPlot.GoogleCharts per se and is likely caused by the change to the way of loading JS libraries introduced by Google: XPlot.GoogleCharts ver 1.4.2 uses the old loader , while the latest XPlot.GoogleCharts ver 1.5.0 uses the new one.

Related

Can't load ACE editor in a firefox addon, but can in chrome

I am using ACE editor in my browser extension. It all works fine in a Chrome/Chromium browser, but when I try the extension in Firefox (latest version), only ace.define and ace.require are available (ace.edit is needed, at least, to initialize).
Here is the part of the manifest (MV2) file involved:
"content_scripts" :
[
{
"matches": ["*://example.com/*"],
"all_frames": true,
"js": [
"ace-min/ace.js",
"myscript.js"
],
"run_at": "document_end"
},
]
What could be done wrong? Both files are being read, but only a part of ace.js seems to be executed. Imagine that myscript.js contains a console.log(ace), to see which functions can I use.
Thanks in advance!
I posted an issue on the ACE's GitHub repository. The response was very quick and polite.
All is explained in this comment: https://github.com/ajaxorg/ace/issues/4898#issuecomment-1217887526
Just a side note, use noconflict ace instead of normal ace. The function you need to change is at the bottom.

How to save / export a XPlot Plotly or Google Chart to PDF / image (F#)?

when I create a chart in XPlot (F#) with Plotly (or Google Charts) like this
let trace =
Scatter(
x = [1; 2; 3; 4],
y = [10; 15; 13; 17]
)
let chart = Chart.Plot trace
Chart.Show chart
How can I export the chart as PDF or image file?
Thanks very much!
Update:
I can get the HTML string and export it as follows
let chartHtml = chart.GetHtml()
System.IO.File.WriteAllText("C:/temp/chart.html", chartHtml)
Next I need to figure out how to transform the HTML into a PNG or a PDF. Any ideas?
2nd update:
I tried using several HTML-to-PDF converter libraries, including
OpenHtmlToPdf
Select.HtmlToPdf (see suggestion by #Jeff_hk below)
Unfortunately, those don't do the job. I guess that the support for JavaScript is limited. The HTML output from XPlot imports the Plotly library (JS).
For now I'm using FSharp.Charting that comes with its own export methods, but is less versatile.
Any other suggestions are still welcome! Thanks
If you have already the html saved somewhere, you can just then use the package (on NuGet) Select.HtmlToPdf
Here an example
let conv = new SelectPdf.HtmlToPdf()
let doc = conv.ConvertUrl("d:/index.html")
doc.Save("d:/index.pdf")
doc.Close()
Hope it helps

Meaning of CsvProvider error "The given key was not present in the dictionary" when trying to load sample file?

I am having trouble loading the csv files with FSharp.Data csv provider provided by fslab, including the sample adwords.csv file.
What does this error below mean? Also, when I hover over the code in the Visual studio editor it mentions that "The given key was not present in the dictionary"
Problem example:
#load "packages/FsLab/FsLab.fsx"
open System.IO
open FSharp.Data
"adwords.csv"
|> File.ReadAllLines
let test = CsvProvider<"adwords.csv">.GetSample()
The output:
>
val it : string [] =
[|"Criteria ID,Name,Canonical Name,Parent ID,Country Code,Target Type,Status";
"1000010,Abu Dhabi,"Abu Dhabi,Abu Dhabi,United Arab Emirates",9041082,AE,City,Active";
"1000011,Ajman,"Ajman,Ajman,United Arab Emirates",9047096,AE,City,Active";
"1000012,Al Ain,"Al Ain,Abu Dhabi,United Arab Emirates",9041082,AE,City,Active";
"1000013,Dubai,"Dubai,Dubai,United Arab Emirates",9041083,AE,City,Active";
"2004,Afghanistan,Afghanistan,,AF,Country,Active"|]
>
>System.MethodAccessException: Attempt by method '<StartupCode$FSI_0007>.$FSI_0007.main#()' to access method 'FSharp.Data.Runtime.CsvFile`1<System.__Canon>.Create(System.Func`3<System.Object,System.String[],System.__Canon>,
at <StartupCode$FSI_0007>.$FSI_0007.main#() in C:\test.fsx:line 11
Stopped due to error
I ran into this problem with my own files, so I grabbed this sample file from here: https://raw.githubusercontent.com/fsharp/FSharp.Data/master/tests/FSharp.Data.Tests/Data/Adwords.csv
Debug info:
If I delete the FSharp.Data library folder (v 2.3.0) and replace with version 2.2.5 it works correctly with no error.
If I don't use the FsLab.fsx script and instead use
#I "packages/FSharp.Data/lib/net40
#r "FSharp.Data.dll"
then everything works.
The path to the FsLab.fsx script is correct, it runs when I send the line to fsi.
The F# version is 14.0.23413.0.
The version of FSharp.Data downloaded by FSlab is FSharp.Data.2.3.0.
I have no other references in the .fsx script.
I am using Visual Studio Community edition 14.0.24720.00 Update 1.
.NET version 4.6.01038
I am realizing now that I am not getting the popup asking if I want to allow the .dll like I think I used to get when I used this before.
There is nothing wrong with the file. This for example works:
#load #"..\..\FSLAB\packages\FsLab\FsLab.fsx"
open System.IO
open FSharp.Data
[<Literal>]
let csvFile = #"C:\tmp\adwords.csv"
File.Exists csvFile
type Csv = CsvProvider<csvFile>
let csv = Csv.Load(csvFile)
csv.Rows
There is something wrong with your FsLab of FSharp.Data installation or type providers security maybe. Try the following, specify the path to the file directly. If it still doesn't work just nuget FSharp.Data and try using the csv type provider directly in a new project.
Other info is also helpful. VS version, FSLab version, wha other references you have. etc.
EDIT: Thanks for the debug info. That's actually quite helpful. VS2015 Update 1 broke two things, the Binding Redirect for Fsharp and the type providers (that might have been FSharp Tools, I forgot). I would upgrade to Update 2. If that's not possible please check if your FSharp.Data.TypeProviders.dll is in C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\Type Providers.
As referencing the dlls directly works, it's probably a version mismatch issue. My FsLab install predates VS2015 Update 1 and 2, so will see if it behaves differently with a new download.
There is some issue with the installation of FSharp.Data currently bundled with FsLab (as of June 2016). This issue is with version 2.3.0. If you instead use FSharp.Data 2.2.5 the code works as expected.
Delete the packages/FSharp.Data folder and replace with version 2.2.5. I did it from an old installation but you could do it from Nuget

#load a package in F# interactive (FSharpChart.fsx)

Hi i'm a noob and asking this newbie question, please forgive me.
I've installed successfully FSharpChart in my local directory
...
Added package 'MSDN.FSharpChart.dll.0.60.0' to folder 'C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Expert in F\packages'
Added package 'MSDN.FSharpChart.dll.0.60.0' to 'packages.config'
Successfully installed 'MSDN.FSharpChart.dll 0.60.0' to Expert in F
now, if i do
#load "FSharpChart.fsx";;
^^^^^^^^^^^^^^^^^^^^^^^
stdin(4,1): error FS0078: Unable to find the file 'FSharpChart.fsx' in any of
C:\Users\Fagui\AppData\Local\Temp
additional info:
inside this folder, i see a nupkg file, and a lib directory
Inside the lib directory, there is a dll, and a pdf file,
but i don't see any .fsx file.
basically, F# has installed the package in the active folder for the current project, and F#interactive is in another folder ?? bit strange ?
should i install another time the package ? or what is the way around it ?
thanks
UPDATE:
i don't know why, but apparently when i installed the FSharpChart package, I only got the dll, no fsx file
i managed to load it doing
#I #"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Expert in F"
#r #"packages\MSDN.FSharpChart.dll.0.60\lib\MSDN.FSharpChart.dll";;
unfortunately, typing the script in F# interactive
open MSDN.FSharp.Charting
let rnd = System.Random()
let rand() = rnd.NextDouble()
let randomPoints = [for i in 0 .. 1000 -> 10.0 * rand(), 10.0 * rand()]
randomPoints |> FSharpChart.Point;;
doesn't yield any chart, but just returns a list
val rnd : Random
val rand : unit -> float
val randomPoints : (float * float) list =
[(9.765916457, 2.272289941); (0.8211438594, 1.625466995);
...
(7.783786034, 7.572208311); (6.497914692, 3.66987128); ...]
val it : ChartTypes.PointChart
this may be due to the fact that the library is not supported anymore, and that i should use a newer library like Thomas Petricek indicated.
So, i did manage to install FSharp.Charting instead
let rnd = System.Random()
let rand() = rnd.NextDouble()
let randomPoints = [for i in 0 .. 1000 -> 10.0 * rand(), 10.0 * rand()]
randomPoints |> Chart.Point;;
and it did work
There is a newer version of the FSharpChart.fsx library which is called F# Charting, so first of all, I would recommend using this newer library instead (the API is quite similar, but F# Charting has a number of improvements).
The documentation for F# Charting also has a detailed page on referencing the library.
Typically, when you reference the library using NuGet, you'll need to specify relative reference:
// On Mac OSX use packages/FSharp.Charting.Gtk.0.90.13/FSharp.Charting.Gtk.fsx
#load "packages/FSharp.Charting.0.90.13/FSharp.Charting.fsx"
Where 0.90.13 is the version of the library that you got from NuGet (you may need to check the folder name - the path references in #load are relative to the place where your script lives).
Yes, F# Interactive is independent of the current project.
Use:
#load #"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Expert in F\packages\FSharpChart.fsx";;
Also you can use the #I directive if you need to reference assemblies of a specific folder, see the reference.

How to configure for inserting spaces instead of tabs on Visual Studio Code for Mac

I begin to use Visual Studio Code. Current version is 0.3.0.
By default, Indent is inserted for tabs.
But I want to insert 4 spaces instead tabs.
I can't find the configure out the item in Preferences.
Please tell me, how to configure insert tab or space.
Approximately since version 0.9.0 this configuration is easily reachable by modifying the following parameters in the settings.json file:
// Controls the rendering size of tabs in characters. Accepted values: "auto", 2, 4, 6, etc. If set to "auto", the value will be guessed when a file is opened.
"editor.tabSize": 4,
// Controls if the editor will insert spaces for tabs. Accepted values: "auto", true, false. If set to "auto", the value will be guessed when a file is opened.
"editor.insertSpaces": true
For others settings and information visit the VS Code help section.
What you are looking for is in keybindings.json. From the menu Code -> Preferences -> Keyboard Shortcuts
On the right hand pane you can place your key bindings, for example:
{"key": "ctrl+t", "when": "editorTextFocus", "command": "editor.action.tab"}
though you would probably prefer something like:
{"key": "ctrl+t", "when": "editorTextFocus", "command": " "}
The problem is that it does not work as the documentation says it should!
See: Customization of Visual Studio Code
Microsoft has been notified of the behavior and tab handling preferences have also been requested.

Resources