I want to make a timeline where the user can choose between scrolling to zoom or select a region to zoom.
There are some examples of the first like:
https://bl.ocks.org/mbostock/4015254
Or zooming in on a area with brush:
https://bl.ocks.org/mbostock/f48fcdb929a620ed97877e4678ab15e6
But I cannot find an example that does both. How can I do both? Or are there any examples that I missed?
Brushable and zoomable timeline with d3
1.3k Views Asked by MM 2x13 At
1
There are 1 best solutions below
Related Questions in JAVASCRIPT
- Angular Show All When No Filter Is Supplied
- Why does a function show up as not defined
- I count the time the user takes to solve my quiz using Javascript but I want the same time displayed on another page
- Set "More" "Less" font size
- Using pagination on a table in AngularJS
- How to sort these using Javascript or Jquery Most effectively
- how to fill out the table with next values in array with one button
- State with different subviews
- Ajax jQuery firing multiple time display event for the same result
- Getting and passing MVC Model data to AngularJS controller
- Disable variable in eval
- javascript nested loops waiting for user input
- .hover() seems to overwrite .click()
- How to sort a multi-dimensional array by the second array in descending order?
- How do I find the fonts that are not loading in a CORS situation ( MoovWeb )?
Related Questions in D3.JS
- Change size of bubble in Scatter Plot for c3.js
- D3 Mouseenter vs Mouseover
- Svg containers not positioning properly
- Bar chart columns not grouping in D3/C3
- Drill down capabality in C3.js
- Changing data sources with zoomable d3 treemap
- Repeat an object with different input data
- d3.js Line Chart Custom x-axis
- D3 Pie Chart with only one part of JSON data
- Prevent click action when dragging a D3 Node
- selecting and using textPath elements in Chrome
- D3.js collapsable tree - visualise set number of levels
- access the array->object -> array values
- How to set a domain on an axis and have the axis intervals not constant or take up different amount of interval spaces using d3
- Detect which type of d3 scale I am working with
Related Questions in ZOOMING
- Make scaled-down image on HTML page clickable to see it in full size
- D3 Bounded Panning
- fabricjs - Zoom canvas in viewport (possible?)
- Google Maps v3 fitBounds inconsistent zoom
- Crop image with settable center and scale in Python PIL
- How to zoom into a picturebox image without changing the image sharpness?
- How can I implement a Zoom Panel with Java Swing libraries
- Divs move around when i zoom in/out
- How to check if user have zoom from js?
- Protractor key-down and send keys to zoom browser
- zoom jpeg image on canvas with mousewheel event in javascript
- UICollectionVIew zoom of a single UIImageView in a cell
- Zooming the ggplot or normal plot in R
- Graphic, zoom function
- how to maintain the location of a picturebox in the panel
Related Questions in BRUSH
- Placement of d3 brush resize groups
- CreateSolidBrush using hex values of color
- Setting pattern colours and line thickness on QtCore.Qt.CrossPattern
- Issue with updating d3 interactive matrix scatterplot to v4
- Brushable and zoomable timeline with d3
- How Can I Access To SolidBrush In Console Application C#
- Combining semantic zooming and quadtree brushing in D3
- d3.js brush with multiline chart
- d3 using zoom and brush on a bar chart
- Create borderbrush "around the border path"
- Windows graphics orders implementation in java
- D3.js cant get multilines while the brushing is working graph
- Set color levels of Brush in wpf
- d3.js dynamically create brush functions
- D3 Brush (multiple brushes)
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
This is not the most straightforward thing to implement. As you will notice, the brush based zooming does not rely on
d3.zoombut instead performs the zooming via listeners that fire on events to do whatever is needed to scale the axes and move the plot elements accordingly.In comparison, all the scrolling based zoom examples typically rely on
d3.zoomwhich utilizes ad3.zoom()behavior that keeps track of all the transforms performed on the plot while panning/zooming and is solely responsible for updating the various chart elements. The difficulty lies in the fact that the 2 approaches are quite different and if you manually change the chart view via brushing, you need to figure out a way to update the internal zoom transform thatd3.zoomreferences so that it is aware of the changes made via the brush based zoom events.This is not at all easy to do because
d3.zoomwas not designed to be fed information from elsewhere and the internal record of transforms that were performed are not meant to be updateable/mutable. You can update the transform viaselection.call(zoom.transform, d3.zoomIdentity);but that unfortunately also fires a whole bunch of events related to the actual zoom behavior, which is not something you want since you already handled all the zoom behavior with your brush based zoom. An ugly, but effective workaround that I was able to use to reset the zoom transform was to mutate the actual.__zoomfield of the DOM node that is bound to thed3.zoombehavior as follows:So for example: If you want a 2D brush for rectangle zooming, but also
d3.zoombased zooming for panning and mouse-scrolling, then anytime you use the 2D brush to zoom, you will want to reset the d3.zoom transform back to the identity transform as above. This prevents and ugly and jarring jitter in panning/scrolling response when chaining 2D brush based zooming actions with panning/mouse-scrolling actions due to the transform on record withd3.zoomnot being in-sync with the view on display (due to the 2D brush based zoom changing the view without d3.zoom's knowledge).Here is something else that is important to note:
d3.zoomhas a limitation in that it currently only supports a common zoom scale for both X and Y axes (Source). This unfortunately means that there is no way to map a 2-D brush based zoom to ad3.zoombased approach since 2D brush based zooming produces different zoom scaling in X and Y. If you want to do things with minimal issues, using a consistent approach, I'd recommend looking into using d3.xyzoom. This is a fork ofd3.zoomthat implements support for different scales for X and Y axes. This would enable you to calculate the corresponding X and Y zoom scaling and translation values for any 2D brush selection, which you could then feed intod3.zoom, thus enabling you to perform all the zooming using a common approach (which also results in the least amount of code duplication).That being said, if you are solely interested in a 1-D brush based zoom, you should be able to map that to a d3.zoom approach so that you don't have to deal with 2 different paths for handling the view and scaling of all the axes and other graphical elements in your chart. Here is a good example of this:
https://bl.ocks.org/mbostock/34f08d5e11952a80609169b7917d4172
I apologize for the length of this post and if it is a bit rambling. I am working on putting together a block on my work in a couple of days and I'll try to circle back here and post a link when I get around to doing so. I only started learning D3 a week ago, so I'm learning along the way.