How to reposition non reliative multiple labels of edges in JGraphX - jgraphx

In a graph, I have edges that have more than one label (multi labels): one label is beside the source cell and another one beside the target cell. Both labels are created as child vertices of the edge. For correct positioning adjustement reasons, these labels do not have their geometry set relative (to the edge). When generating the edges, labels are correctly positionned: I use the mxGraphView.getPerimeterPoint() and an few adjustements to position the source and target labels.
When moving a cell using the mouse drag, I need to reposition these labels. For the moment I have tried to react to graph events (mxEvent.CELLS_MOVED, mxEvent.MOVE_CELLS) or model events (mxEvent.CHANGE) registering either a graph or a model listener.
However, the getPerimeterPoint function uses an mxCellState (not an mxCell) obtained through the graphView (graph.getView().getState(cell)) to do the calculation and this cell state mxGeometry is based on the previous position of the cell.
Is this solution based on events the correct way of doing this?
And if yes, should I rewrite completely the getPerimeterPoint (and functions used in it) to use the mxCell returned by the event (event.getProperties("cells")) whose greometry is correct rather than the mxCellState? Or is there a technique to get the cell state corresponding to the end of the current move operation without messing up the whole graph update process?
Any help or advice appreciated, thanks.

Related

Can you force a label on top of a bar chart in SQL Server Reporting Services?

I would like to ensure the labels of my bar chart are above the bars. Can you force a label on top of a bar chart in SQL Server Reporting Services? If so, how?
The issues are the colors are so dark, it's hard to read them if they are not above the bar in the chart. I could just change the colors, but I'd rather learn how to force the label location if possible.
I'd like all numbers to be above the bar, like over the blue bar below. I have over 100 different charts in my report, so the scale will vary greatly depending on the particular report.
Thank you!
In Visual Studio, design mode, ensure that the properties window is visible, then click on any of the labels on the chart.
At this point, the properties window should show the properties for Chart Series Label.
Find the 'Position' property, which probably is showing the value 'Auto', change this value to 'Top' and this should do the trick.
You have to first make sure the chart type is not stacked.
In my experience the "Position" property doesn't always work.
Sometimes you have to go to the properties of the series, then "Custom Attributes", then "Label Style" then select "Top".
What #niktrs said in the comments of the other answer about setting the AllowOutsidePlotArea property is also true.
Microsoft do not use the label Position property for some of the chart types.
They tell us what they use by default here - in your case "on bar charts labels are placed outside of the bars that represent data points" (they appear to mean "column charts")...but sometimes with a large value it's placed just inside, sometimes partially in-out (and if you try the "Outside" position it just fails to render!).
As #jayvee has mentioned the trick with Column charts is to select the value and change the SmartLabels AllowOutSidePlotArea to True (from Partial).
However if you have a Stacked Bar chart then labels are always in the centre of the particular value.
The hack to get labels on top is to add an extra Stacked Bar value with the Color set to "No Color" and move it to the top of the values (using the Chart Data designer arrows).
The trick is getting a good expression value to use - a constant ends up too big or too small at some point, so I found a percentage of the stacked values works best (remembering to change Nulls to Zeros)...25% to 30% usually works.
Then set the value Label to the value you want to display in the data label.
I just had this issue, I was able to fix it by making sure the chart series "Smart Labels" - "Disabled" property was set to "True"
This is what my properties pane looks like:

Movable/Draggable RectangleAnnotation to Select a Range

I'm using OxyPlot to show a rectangle annotation to the user, so it can select a range. However , I want to make this RectangleAnnotation Movable across the X-axis. Besides that, the user should be able to change the range by dragging the two sides of the rectangle (MinimumX and MaximumX).
Is this even possible? Any ideas or starter points for me to do this?

JFreeChart Ring Chart : Only Legends section is displaying but Ring Chart is not displaying

Can anyone help me out Why Only Legends section is displaying but Ring Chart is not displaying IF the data set has more data records say > 50. I have stuck with it.
Depending on the data, that may be too many values to display usefully. You can try the static method DatasetUtilities.createConsolidatedPieDataset() to derive a dataset that is "modified by aggregating all the low value items (those whose value is lower than the percentThreshold) into a single item with the key "Other".
Is there any other way to increase entire chart size?
I'd override getPreferredSize() in ChartPanel like they show here.

How to program the Distance Between Axis Intervals (Charts)

I am creating a custom bar chart using VB.NET, I am wondering if there is a way to program the distance between intervals in the y axis. For example if I wanted the distance between points 1 and 2 in the axis to be of a certain length e.g 2cm long and the next interval to be of a certain length e.g 5cm long, is there a way to achieve this. Any help would be appreciated.
You can set the ChartArea to be a specific size and then configure the Axis.Interval property
No (at least, not easily). The Axis.Interval property sets all intervals to be the same size. You would need to subclass Chart and override the OnPaint method to draw the ticks (and/or grid lines) with different spacings. Not sure offhand if there are ways to have it paint parts of the chart as it normally would, while doing custom painting on other parts...
ETA: It may become slightly easier if you only have 2 intervals to worry about (e.g., the axis line itself, then one line 2 cm up, then another line 5 cm up from that, and no more lines after that). You could probably use the Axis.Interval and Axis.MinorGrid.Interval properties in that case.
ETA again, since it didn't show up nice in the comments: One thing you could try is to hide all of the ticks and grid lines, and then handle the OnPaint event (not override) to just draw lines on top of the chart where needed. Something like this psuedocode
private void ChartPaint(object sender, Args e) {
e.Graphics.DrawLine(figure_out_2cm_above_axis, Color.Black, etc);
e.Graphics.DrawLine(figure_out_5cm_above_line, Color.Black, etc);
}

Why can't I set DataLabel.Position to xlLabelPositionCustom?

I am working with vb.net and excel 2007 to create some graphs for myself. I wanted to set the datalabel positions to a custom value since the default above position (xlLabelPositionAbove) causes the labels to clash with error bars and the default option for a side (such as xlLabelPositionRight) may leave the label over another point or other errorbar. Due to this, I wanted to set the label to a custom position where it is off to about a 45 degree angle to the top right (like right in the middle of where the default above and right positions would place it).
I tried doing this by adjusting xlMySeries.Points(index).DataLabel.Top and xlMySeries.Points(index).DataLabel.Left at first, however I ran into an undescriptive error leading me to believe I was not doing things correctly. I then thought to try setting xlMySeries.DataLabels.Position = xlLabelPositionCustom and then adjusting top and left. However, to my surprise, I could not even change xlMySeries.DataLabels.Position to xlLabelPositionCustom!
Whenever I try to adjust top, left, or the position to certain datalabel positions, I get HRESULT: 0x80004005 (E_FAIL), which I have generally found to mean "You are doing it wrong" in my experience so far with excel. I cannot set the position member to custom, or anything other than just above, left, right, center (so not bestfit, custom, or any inside___ one)
Any idea why I cannot set the position property to what I need it or otherwise change the position of my datalabels? I just need SOME way to adjust the positioning of my datalabels to a custom psoition (or position other than above, left, right, center, bottum). Thanks in advance!
You can set positions only to whose which you can see on the Data Label properties window.