Skip to main content

Adding an existing D3 Visualization

Using an Existing D3 Visualization

You can use the Visualization Builder tool to customize an existing D3 visualization and integrate it with MicroStrategy.

In this example, we describe how to customize a D3 Waterfall Chart, a publicly available visualization created by RSloan. You can get the code for this visualization from the public website, http://bl.ocks.org/rsloan/7123450, but to make the process as simple as possible, we have provided a zip file with the CSS, javascript and data files that are used by this visualization.

Once you have walked through the process of customizing the D3 Waterfall Chart, you can extrapolate from the instructions in this topic to customize other D3 visualizations.

  1. Install the Visualization Builder tool, if you have not already done so.
  2. Download the zip file that holds the CSS, javascript and data files used by the D3 Waterfall Chart visualization. Unzip the contents and save the following files in a location where they are easily accessible.

    • WaterfallChartJS.js
    • WaterfallCSS.css
    • data.csv
  3. Open MicroStrategy Web. In this example, use a Google Chrome browser because the instructions include ways to use Google Chrome Developer Tools to help understand and debug your visualization.
  4. Click the Visualization Builder link on the navigation pane to open the Visualization Builder tool.

    external image VisBuilderLink.png
  5. Click the Configuration tab.


    external image VisBuilder_ConfigTab.png


    1. For Visualization name, enter a descriptive name for the custom visualization you are building.

      external image VisBuilder_VisName.png
    2. Configure the required external libraries. You can get these from the D3 visualization code. One at a time, enter the URL for each library that you want to add in the text box at the bottom of the panel and click Add Library. In this example, you add the following D3 libraries:

      http://code.jquery.com/jquery-latest.js
      http://d3js.org/d3.v3.min.js

      external image VisBuilder_PropertiesTab_Libraries.png

    3. Click Apply.
  6. From the File menu, choose Save As.

    1. For Folder name, enter the name of the plug-in folder for your custom visualization. This is generally the same name as the visualization.

      external image VisBuilder_FolderName.png
    2. Click OK. The plug-in folder for the custom visualization you created is saved under your plugins folder.

      external image VisBuilder_FolderSaved.png
  7. Click OK.
  8. Close the Visualization Builder, and then re-open it.
  9. From the File menu, click Open. Select your custom visualization.

    external image VisBuilder_OpenVis.png

    1. The Code Editor tab should be open. Copy the code for the D3 visualization you are using. Paste the CSS for the style and the javascript code into the Code Editor tab. In this example, you copy and paste the contents of WaterfallCSS.css under Style , and you copy and paste the contents of WaterfallChartJS.js under Plot Code. Don't be concerned about the warnings.

      Note: While you are working on your visualization, the size and placement of the Style and Code sections on the Code Editor tab may vary, depending on factors such as whether Developer Tools are open, if you expanded a section, etc. In some cases, there is a large space between the Style and Code sections and you need to scroll down to see the code.

      external image VisBuilder_CodeEditorTab.png
    2. In the javascript code, find the D3 statement that adds the visualization to the body of the page. This is usually d3.select("body"). Replace it with d3.select(this.domNode).

      In this example, you change:
      var svg = d3.select("body").append("svg")

      to:
      var svg = d3.select(this.domNode).append("svg")
    3. Open the Google Chrome Developer Tools and disable caches by selecting Disable cache on the Network tab.

      external image DisableCache.png
    4. Click Apply in Visualization Builder.
    5. In the Google Chrome Developer Tools Console, an error will be displayed, saying that a resource was not found.

      external image DebuggerConsole.png

      This error is displayed in the Console because the code you pasted uses a data.csv file to load the data, and that file does not exist.

      external image CSVDataError.png
    6. Most D3 sample visualizations have an example of the data that is being used. In this case, the following data has been provided by the author.


      external image CSVData.png

    7. To have a better understanding of this visualization, add the data.csv file to the same folder in your plug-in where the javascript files are located—for example, ../plugins/MyCustomD3WaterfallChart/javascript/mojo/js/source/data.csv.

    8. After you add the data.csv file to the folder mentioned above, click Apply in the Visualization Builder again. The visualization should now display in the right panel.


      external image D3WaterfallChart.png

    9. You can use debugger to pause the execution of your code and inspect what is being done. This is a useful way to understand how the visualization gets and manipulates the data. Add debugger; after the data from data.csv has been retrieved.

      external image DebuggerCode.png
    10. Click Apply again. Notice that debugger stops the code execution.

      external image DebuggerConsole2.png
    11. On the Console tab, type "data" and press Enter. Expand each of the data objects on the console to see additional details about the data parameters that are being passed to the csv method.


      external image DebuggerConsole3.png


      This is a useful way to understand the format of the data. When data is retrieved from MicroStrategy using the API, the format might or might not be the same as the format expected by your visualization. Understanding this helps you to determine if you need to further manipulate the data in order for the visualization to work as expected with data coming from MicroStrategy.


      Remove debugger: from the code and save the file.

    12. Now you need to add your MicroStrategy data to your custom D3 visualization. You must do this before you add debugging code; otherwise, the code is deleted.

      1. To add data to the visualization in this example, you use an existing dataset in the MicroStrategy Tutorial project. You choose Select Existing Dataset, navigate to Shared Reports -> Subject Areas -> Customer Analysis -> Customers Summary, and click Select. If you are using an external dataset, you would choose Add External Data and import the data you are using.

        external image VisBuilder_Dataset.png
      2. Open the Editor tab.

        external image VisBuilder_EditorTab.png
      3. Drag the attributes and metrics you want to use for your visualization onto the Editor tab. In this example, you use:

        • Attribute: Month
        • Metrics: Customer CountCustomer Count ForecastLast Month’s Customer Count
        external image VisBuilder_EditorTab_Data.png
    13. Now, you must replace the statement that pulls the sample data for the D3 visualization with a statement that pulls the data from MicroStrategy. In this example, the D3 visualization expects tabular data.

      Usually there are two types of data:

      • Tabular data

        • Typically represented by d3.csv("filename.csv",function(error,csv)){}
        • Since the visualization in this example expects tabular data, open the Code Editor and add:
          var csv = this.dataInterface.getRawData(mstrmojo.models.template.DataInterface.ENUM_RAW_DATA_FORMAT.ROWS_ADV);
          before:
          d3.csv("data.csv",function(error,csv)){}
      • Tree data

        • Typically represented by d3.json("filename.json",function(error,json)){}
        • If a visualization expects tree data, you would use::
          var json = this.dataInterface.getRawData(mstrmojo.models.template.DataInterface.ENUM_RAW_DATA_FORMAT.TREE);
      Note: In some cases, it is not simple to replace the csv method with the MicroStrategy API. For these cases, make sure that the data variable has the MicroStrategy data and not the data being retrieved from the CSV file.
    14. Add debugger under var csv = this.dataInterface.getRawData(mstrmojo.models.template.DataInterface.ENUM_RAW_DATA_FORMAT.ROWS_ADV);and click Apply again.

      Note: You must have added a dataset before adding the debugger code described above. If you add the debugger code first and then add a dataset, the code is deleted.

      external image DebuggerCode2.png
    15. You can use the Console to find the format of the data that is being retrieved from MicroStrategy as follows:


      When you clicked Apply, the execution is stopped by debugger after the data was retrieved from MicroStrategy:


      external image DebuggerConsole4.png


      On the Console tab, type "csv", and then press Enter. The MicroStrategy data objects are displayed.


      In this example, you will see that the data being retrieved from MicroStrategy has a different format from the data being used by the author of this visualization:


      Format of MicroStrategy data:


      external image DebuggerConsole5.png


      Format of visualization (D3 Waterall Chart) data:


      external image DebuggerConsole3.png


      The main difference is that the MicroStrategy data has an object with the metric value. The visualization data does not have an object for the metric.


      Remove debugger: from the code and save the file.

    16. You need to add additional logic to modify the MicroStrategy data so that it looks more like the data expected by the visualization. In this example, you add the following code after the line of code that pulls the MicroStrategy data:

      var gridData = this.dataInterface;
      var rowHeaders = gridData.getRowHeaders();
      var attributeName = rowHeaders.titles[0].n;
      for (var i = 0; i < csv.length; i++) {
      for (var key in csv[i]) {
      if (key !== attributeName) {
      csv[i][key] = csv[i][key]["rv"] + "";
      }
      }
      }

      If the object key does not match the attribute name, then you set that property to be the value of the metric. Note that the value of the metric in this visualization data is a string. That is why an empty string is being added to the value: csv[i][key] = csv[i][key]["rv"] + "";

  1. After you add the code with the additional logic, add debugger; after the new block of code to check how the data looks now.

    external image DebuggerConsole8.png

    Click Apply. When the execution stops, open the Console, and type "csv". The csv variables now look more like the data coming from data.csv.

    external image DebuggerConsole9.png

    Remove debugger: from the code and save the file.
  2. Now that the format of the data matches, you can replace the content of the data variable with the MicroStrategy data. After the code that gets the data, add data = csv;.


    external image DebuggerConsole10.png


    Now data refers to the variable you added earlier to pull MicroStrategy data:

    var csv = this.dataInterface.getRawData(mstrmojo.models.template.DataInterface.ENUM_RAW_DATA_FORMAT.ROWS_ADV);


    To confirm that the correct data is being retrieved, add debugger; after data=csv;and click Apply. When the processing stops, open the Console and type "data". The data should look like MicroStrategy data.


    external image DebuggerConsole9.png

    Remove debugger; and save your file. Stop and start the Visualization Builder.

  3. Many of the visualizations available on the Internet are created exclusively for the data the author references. In this example, the author uses the attribute called “period”, which is hard-coded in three places in the JavaScript code. You must replace all instances of the string "period" with the name of your attribute variable, attributeName.
    In the additional code you added, you get the attribute, called attributeName, by using:


    var gridData = this.dataInterface;
    var rowHeaders = gridData.getRowHeaders();
    var attributeName = rowHeaders.titles[0].n;

    In this example, you are using the attribute name. If you wanted to get the metric name, you would use the following line of code:


    var gridData = this.dataInterface;
    var metricName = gridData.getColHeaders(0).getHeader(0).getName();

    Note: Make sure to use the correct syntax. If you are trying to access the property of an object, you have to use square brackets so that the expression is evaluated first and then the value is gotten. For example, this doesn’t work:


    data[0].attributeName

    but this will return “2010”.


    data[0][attributeName]

    Make the following replacements:


    Replace
    return key !== "period";
    with
    return key !== attributeName;
    Replace:
    x0.domain(data.map(function(d) { return d.period; }));
    with
    x0.domain(data.map(function(d) { return d[attributeName]; }));

    Replace:
    return "translate(" + x0(d.period) + ",0)";
    with
    return "translate(" + x0(d[attributeName]) + ",0)";
  4. Finally, modify the width and height of the visualization so that the screen adjusts correctly. Typically, the width and height of visualizations are defined as fixed values. These must be replaced so that the sizes reflect the available space in MicroStrategy. For example:


    var margin = {top: 10, right: 10, bottom: 10, left: 10},
    width = parseInt(this.width,10) - margin.left - margin.right,
    height = parseInt(this.height,10) - margin.top - margin.bottom;
  5. Save your visualization and click Apply again. The Waterfall Chart should be displayed with your MicroStrategy data.

    external image WaterfallChart_MstrData.png

Comments

  1. Hi,
    Its really helpful, thank you so much for sharing this with brief explanation.
    Do we need to add any piece of code to make them use as selector ? or MicroStrategy API handle it by itself.

    Thanks
    Sunil



    ReplyDelete
  2. Excellent article for the people who need information about this course.
    Learn Data Science Online

    ReplyDelete
  3. If you are looking to download an MTD template, you may need to specify which specific type of template you are referring to. For example, if you are a VAT-registered business in the UK and you want to submit your VAT returns through MTD, you may need to MTD template download VAT template that is compatible with the software you are using.

    ReplyDelete

Post a Comment

Popular posts from this blog

Reduce Intelligent Cube Size By Finding Intelligent Cube Objects Which Are Not In Use

Reduce Intelligent Cube Size By Finding Intelligent Cube Objects Which Are Not In Use If the i-cubes can potentially be reduced in size an audit can be performed on the cube objects to see which cube objects are not being used by any of the view reports, documents, or dossiers.   The below are examples for a few of the common metadata database platforms . NOTE: To perform this audit, queries are run against the MicroStrategy metadata database. Ensure a metadata backup is taken prior to performing the below actions. Steps: 1) Identify the object ID of the Intelligent cube to be audited by checking the objects Property window 2) Identify the object ID of the project this cube exists within by opening the Project Configuration Sample Cube ID =   CFAF1E9B4D53990698C42E87C7AF2EB5 Sample Project ID =  B7CA92F04B9FAE8D941C3E9B7E0CD754   3) Run the below SQL against the metadata database by replacing the Cube ID and Project ID within the respective ...

MicroStrategy URL API Parameters

MicroStrategy URL Structure The following table summarizes the root URL structure used for every request to MicroStrategy Web. Environment Main Application URL Administration URL J2EE http://webserver/MicroStrategy/servlet/mstrWeb http://webserver/MicroStrategy/servlet/mstrWebAdmin .NET http://webserver/MicroStrategy/asp/Main.aspx http://webserver/MicroStrategy/asp/Admin.aspx Every request sent to MicroStrategy Web calls a central controller. Parameters are appended to  Main.aspx  or  mstrWeb  (in a .NET and J2EE environment, respectively) to indicate to the controller how the request should be internally forwarded and handled. The following examples show a URL for accessing a MicroStrategy folder when the user does not have an existing session. The URL contains not only the parameters needed to connect to MicroStrategy Web, but also the parameters needed to log on and create a session. J2EE environment: <a href="http:...

Algorithm to calculate Logical Table Size in Microstrategy

How are the fact tables determined using the logical table size for SQL generation in MicroStrategy The logical table size is an integer number that represents the granularity or level of aggregation of a particular table. It is called 'logical' because it is not related to the physical size of the tables (number of rows). It is calculated according to the attribute IDs that are present in the table and their level in the system hierarchy.   Even though, the number does not reveal the actual number of rows in the table, it is an accurate way of measuring a table size without having to access its contents.   IMPORTANT:   The system hierarchy is defined by the parent-child relationships between attributes of the same family (formerly known as a dimension), not by user-defined hierarchies (i.e., drilling hierarchies).   MicroStrategy Engine utilizes an algorithm based on attribute keys to calculate the Logical Table Size (LTS): Given the following tables: ...

Conversion failed when converting the varchar value 'xxxx' Microstartegy

Error "Conversion failed  Error "Conversion failed when converting the varchar value 'xxxx' to data type int" happens when displaying Picture type attribute form using ApplySimple in expression against SQL Server 2012 in MicroStrategy  The attribute form is in Picture type and defined with the following ApplySimple function with Int type column [ID_BARANG] as the input parameter against SQL Server 2012.  Solutions is to use  Concat("Images/demo/s", [BARANG_ID_INT], ".png") ApplySimple("'images/demo/'&#0&'.png'", [ID_BARANG]) However, when running reports with attribute to show the picture form in Web, error message happens in both Web and Developer. Conversion failed when converting the varchar value 'images/demo/s' to data type int. STEPS TO REPRODUCE: SQL Server 2012 database should be used as the warehouse.  Create an attribute form as type Picture and us custom expressi...

Activate MicroStrategy Geospatial Services

Activate MicroStrategy Geospatial Services MicroStrategy 10.11 introduces our new mapping capability: MicroStrategy Geospatial Services, powered by Mapbox. This enhanced map visualization is available for dossiers on all interfaces including MicroStrategy Desktop, Workstation, Web and Library (Mobile included). With MicroStrategy Geospatial Services, MicroStrategy now offers advanced geospatial analytics features that allow users to get more out of their location data. This new feature is available in addition to the out-of-the-box ESRI maps. MicroStrategy Geospatial Services allows users to: Plot polygon shapes for most countries, down to the zip code level Perform powerful interaction between layers (progressively hide or show data layers as zoom levels change) Identify and resolve location name conflicts Add thresholds to data points, size markers for metrics, and color by for both attributes and metrics Fine tune clustering behavior when aggregating data on a ma...

Microstrategy Removing sections that do not have metric data

Removing sections that do not have metric data This is an interesting feature which might not be explored by many of us and it comes us handy. A  cross join between datasets can result in rows or Group Header/Footer sections that do not have metric data. For example, a document contains two datasets. Dataset 1 contains Year and Revenue, with data for three years (2007-2009). Dataset 2 contains Year and Profit, filtered to return data for only two years (2008 and 2009). If you place Year and Profit in the Details and execute the document, it displays three rows, although no profit data exists for 2007. This is a product of the cross join between the two datasets. You do not want to see the blank line for 2007 since it does not give you any data for profit. You can select the  Trim sections for which no metric value data is available  check box. This removes the row for 2007, since no metric data for Profit is available for 2007. The results are shown below: ...

Predictive modelling in Data Science using Microstrategy

Creating a predictive modelling in MicroStrategy MicroStrategy Data Mining Services has been evolving to include more data mining algorithms and functionality. One key feature is MicroStrategy Developer’s Training Metric Wizard. The Training Metric Wizard can be used to create several different types of predictive models including linear and exponential regression, logistic regression, decision tree, cluster, time series, and association rules. Linear and exponential regression The linear regression data mining technique should be familiar to you if you have ever tried to extrapolate or interpolate data, tried to find the line that best fits a series of data points, or used Microsoft Excel’s LINEST or LOGEST functions. Regression analyzes the relationship between several predictive inputs, or independent variables, and a dependent variable that is to be predicted. Regression finds the line that best fits the data, with a minimum of error. For example, you have a dataset ...

"System Prompt" and its uses in MicroStrategy

System Prompt and its uses in MicroStrategy WHAT IS A "SYSTEM PROMPT"? "System Prompt" is a system object that was introduced back in version 8.0.0. The object is named as "User Login" and is implemented as a prompt object. The object can be found under Public Objects > Prompts > System prompts, as shown below: Unlike ordinary prompt objects, system prompts don't require any answers from the user. When a report containing a system prompt runs, the prompt is answered automatically with the login of the user who runs the report. On the other hand, like other prompt objects, answers to system prompts are used to match caches. Therefore, users don't share caches for reports that contain system prompts. For details on how caches are matched, refer to the following MicroStrategy Knowledge Base document: KB5300-7X0-0147 - How are caches matched in MicroStrategy Intelligence Server 7.x? WHEN ARE SYSTEM PROMPTS USED?    System pr...

Enable Incremental fetch in MSTR documents

Enable Incremental fetch in MSTR documents Incremental fetch divides large documents or layouts into pages, thereby loading the data in batches (or blocks) rather than all at the same time. This improves the usability and performance of a large document or layout, by reducing the load and overall memory usage on the web server. To apply incremental fetch to a document In MicroStrategy Web, open the document in the Document Editor. If the document contains multiple layouts, select the layout to apply incremental fetch to. From the  Tools  menu, choose  Document Properties . The Document Properties dialog box opens. On the left, under Layout Properties, select  Advanced . Select the  Enable Incremental Fetch  check box. From the  Fetch Level  drop-down list, select the object to be counted for the incremental fetch level. If the document or layout is grouped, the groups are displayed in the drop-down list. Groups that are displayed...

Multi-Table Data Import(MTDI) from one or more supported data sources

Multi-Table Data Import(MTDI) from one or more supported data sources In MicroStrategy Analytics Enterprise Web 10 onewards, users can now simultaneously import two or more tables from one or more supported data sources, this feature is called Multi-Table Data Import (MTDI) which has been renamed as Super Cubes in MSTR 2019 (Does it sound like multisourcing for all the users without admin help?) Currently, all connectors in MicroStrategy Web 10 except " OLAP " and " Search Engine Indices " support Multi-Table Data Import. Users are able to add multiple tables/files when doing data import from single connector, as shown below: Users are also able to combine multiple tables/files from different sources and store them into one single Intelligent Cube, as shown below: