10

I have two shapefiles representing grids with values that are symbolized with graduated colors, shown below:

Original

You can see that the two shapefiles encompass similar ranges of data, but assign slightly different colors to ranges in these data. I would like to symbolize the ranges in each of the two shapefiles using the same colors for the same ranges, enabling easier comparison between the files and allowing a single legend to be used.

However, when I attempt to classify the ranges with a manual interval, ArcGIS forces what should be the uppermost range to also include the minimum value from the dataset. You can see this in the "-81.64 - 10.00" range of the left data frame, below. This forces the entire layer to be symbolized with this color. Essentially, ArcGIS is requiring that the minimum value in the dataset be used as a value in one of the ranges.

New Intervals

Is there a way to circumvent this feature?

  • I remember having this issue as well, although I can't remember exactly how I solved it. If you classify as "equal interval" and double click on the values, can you change them that way? – GISKid Jul 23 '14 at 18:34
  • @GISKid as soon as I double click, the classification reverts to "Manual", unfortunately. – hfisch Jul 23 '14 at 19:01
  • What about adjusting the values on the histogram itself? – GISKid Jul 23 '14 at 19:02
  • @GISKid the values snap back to the minimum value if you drag them below the minimum value. – hfisch Jul 23 '14 at 19:10
  • 2
    I think the best and simplest answer to this is gis.stackexchange.com/a/136497 - the first (and currently accepted) answer is far too long for my liking. – PolyGeo Feb 24 '15 at 2:04
11

It's definitely a major pain when ArcMap tries to be, um, helpful even when you really don't want it to be.

One workaround I've found is to create a new temporary dataset, and add a few points with the minimum and maximum values that you know you'll need in the output - just be sure to cover the whole range.

Create your symbology based on this fake dataset and save this symbology in a layer file:

enter image description here

... then Import the symbology from the *.lyr file onto your real dataset:

enter image description here

  • 1
    This solution is less hacky than mine was. I'm switching to your answer. – hfisch Aug 16 '16 at 20:43
6

@ChrisW said:

As far as I know and can find evidence for, you cannot set a classification range below the minimum value in the data.

This got me thinking, and I actually found a way to set the classification range below the minimum value. My original issue was built around the fact that the lowest classification range was required to contain the minimum value in the data.

However, no such restriction is placed on the other classification ranges used. Therefore, one can force two (or more) classification ranges to fall below the minimum value in the data. One of these will represent the preferred minimum classification range, while the other will function as a dummy range to contain the minimum value.


Here is the starting point that I used for the classification. Each of the layers in the four data frames were classified using a defined interval of 10 ft without respect to the data ranges of the other layers.

Starting Point

The maximum classification range in any of the four data frames is "0.01 to 10.00", and the minimum classification range is "-110.62 to -110.00" (which will ideally become "-119.00 to -110.00"). Since I am attempting to maintain 10 foot intervals, this translates to a total of 13 intervals.


I am using the top left data frame as the source for my generic legend. I start by opening up the Layer Properties and going to Classify. Since I want 13 intervals to be visible, I need to select 14 intervals to have a dummy range available. I do this by selecting Manual as the method and creating 14 classes.

Step 1a

With the ranges set up in their current state (with the largest values at the top), any changes to the value entered in the range will have no effect on anything other than the range at the very bottom of the list. @ChrisW pointed out that this isn't a bug, but rather a feature of how ArcGIS assigns break values. Here is the Layer Properties window after selecting the Manual method but before making any changes to the ranges:

Step 1b


To solve this issue, I temporarily reverse the sorting of the layer. At this point, the lowest ranges are at the top, while the highest ranges are at the bottom.

Step 2a

Now, if I scroll to the bottom of the list of ranges (where the highest range is displayed) and begin defining the proper intervals from the bottom up, ArcGIS will remember the ranges I define:

Step 2b

In this image, I have defined the upper value in 5 of the 14 ranges, starting with the largest value (10.00) and working downward.


When I reach the top of the list and edit my 14th range, its minimum value will still be defined as the minimum value in the layer, since it does not have another range below it for it to pull a value from:

Step 3a

This does not matter, though, since it is the dummy range that I mentioned before. At this point, I reverse the sorting of the layer once more, so the highest ranges are again at the top. The image below shows the updated legend for the top left data frame, which now reflects the proper ranges for all four data frames, including the 14th dummy range:

Step 3b


The next step is to propagate these changes through to the rest of the data frames. Some issues are apparent, though, when I try to import the symbology to the other data frames:

Step 4a

As @ChrisW pointed out, this is due to my decision to start with a layer that does not have the absolute minimum value across all of the data frames. It appears that the data frame will not display any ranges that fall below the ranges that exist in the original data frame.

If you are starting with a layer like the one I did, the best solution that I have found for this is to repeat the steps that I discussed above for each of the four data frames; manually defining 14 classes, reversing the sorting of the classes, redefining the top of each range, then reverting the sorting to place the highest ranges at the top.

The simplest solution, though, is to start the classification process with the layer that has the smallest value. The Import Symbology option may then be used properly for the other data frames.

Step 4b


Finally, I can delete three of the legends and either hide the dummy range in the remaining legend or convert it to graphics and delete the dummy range.

Ending Point

  • Glad you were able to get something worked out. I edited my answer to correct the mistatement you quoted (I'm not sure why I said that - your original images showed you could). – Chris W Jul 24 '14 at 18:40
  • Actually, I'm having trouble replicating this. To make the answer a bit more useful, could you edit in exactly how you created those ranges below the minimum value? – Chris W Jul 24 '14 at 19:09
  • @ChrisW I've greatly expanded upon the process. Let me know if it still doesn't make sense! – hfisch Jul 25 '14 at 17:13
  • 2
    Thanks for the update. I figured out the issue - there's significant difference in the way defining breaks is handled between the classification and symbology dialogs which relates to what you question as a bug. Basically it auto-sorts the break values, but the lowest break below min value is always tied to min value and appears at the top (or bottom depending on sort). FYI, while you can't specify a total number you can add or remove classes in Manual by right-clicking on the histogram. – Chris W Jul 25 '14 at 18:15
  • 1
    As far as applying the symbology to other data frames, as mentioned in my answer try starting with the data having the lowest value (the -110.62) using that for initial symbology. I note in your third to last image the dummy class min value is still -61.01 for all four, which I believe is why nothing below that renders even though there's a class for it. If you start with the lowest and the min value is higher, I believe it will include or bring up the symbology min to the data min when you apply the symbology to the other data sets. – Chris W Jul 25 '14 at 18:25
4

I came across this same problem, I think.... If I understand it right you had two (or more) datasets and you need to get the dataset scale ranges to match so that comparisons can be made.

I solved it by:

  1. Create you're first dataset as you want it to appear. Ideally with the largest data range just so that symbols can be copied over easier to the second (smaller ranged) dataset.

enter image description here

  1. Create you're second dataset but don't worry about the any symbology just yet. In the second datasets Layer Properties > Symbology tab choose the same type of classification as with the first dataset, for this example I'm using Categories > Unique Values then click the Add All Values button.

enter image description here

  1. Group values so that they fall into the corresponding ranges used in the first dataset. Select all values for a particular category and then right click and select Group. The top two categories have already been grouped in the image below, the four highlighted vales are about to be "pulled" into a third group.

enter image description here

  1. I find it easier at this stage to relabel the categories so that it's easier to keep track of. At this point you can see five of the seven categories populated.

enter image description here

  1. Finally (almost) and the crux of this problem, to add in the empty categories that exist outside the data range of the second dataset. In the Layer Properties > Symbology tab click the Add Values button and populate with the required categories above and below the data ranges as required.

enter image description here

  1. Lastly relabel the new empty categories so that the correspond with the first dataset and then recolour each category so that it matches with the firsts.

enter image description here

Sorry if that's a little over simplified or even plain wrong / bad practice. I've been a long time user of GIS Stack Exchange and thought it about time I started contributing so this is my first post!

  • 2
    Sorry just realised that the OP is for Graduated Data and after a quick check now realise my solution is invalid. I'll read more closely next time.... – Nige Nov 6 '14 at 23:58
3

While the classification uses similar ranges, the data don't share a range. I think the solution here is to solve it in the legend and color assignments, and not the actual classification.

Start with your lower left result, and convert that legend to a graphic. Edit the text to get the ranges you want. I notice all your other images have a 10 unit range, but this one is doing 20 and it overlaps. For example three of the images have -49.99 to -40.00 but the lower left has -49.99 to -60.00, and the next class is -59.99 to -70.00. The images are also opposite ranges - ie three are lower value on the left while the lower left is lower value on the right (which reads a lot more natually to me, increasing numbers if not values from left to right). Maybe those issues need to be addressed first to save some time rather than just a manual text edit.

Once you have a legend with ranges and a color ramp you like, you can go back to your first two layers (which are already classified correctly) and manually edit each range's color patch to match the color you decided on for the range in the legend. Since the two layers won't be displaying their own legends, it won't matter that in one of them the range is actually -89.99 to -80.00 and the other is -81.64 to -80.00 because they'll both have the same color.

Do note, however, that this will imply both data sets have the same range, which they don't. In fact it looks like there will be two color patches that are only used in one map each (the highest and lowest). You might want to put a note on each map that gives their absolute data range. I would also use 'to' instead of '-' between ranges, because with the negative values it's kind of confusing to read.


Alternative solution:

As far as I know and can find evidence for, you must have a class which starts at your minimum value. You can manually add classes (even empty ones) above or below your data range, but one class must start at the minimum value.

So, set your symbology up using the raster that contains the lowest/minimum value of all rasters. Get these symbolized. You can then edit the class label to say whatever you want. So if your lowest value was 0.4, you could still change the label to say 0.

Once you've got this done and set up with the color ramp you like, save a lyr file of the symbology. You should then be able to open your other rasters and apply that same symbology. Because the other rasters will all have values that are higher, they should classify correctly and just the minimum value itself will increase (or perhaps that class will get dropped if nothing falls within it). Which again you can change the class label to the class floor instead of actual value if that doesn't carry over with the symbology.

  • You can actually skip the .lyr step and simply classify one raster as you would like it (ranges, colors, etc.) and then use the import symbology function to apply this to all of your other rasters. Open Layer Properties, select the Symbology tab, select the Folder Icon @ top right (which will indicate Import when you hover over it)- and then select the raster that you want to mimic. – JWallace Jul 23 '14 at 21:38
  • @JWallace True, provided your other rasters are already loaded to the same map document (possibly same dataframe - can't recall if it will let you import symbology from a different one) and you're willing to let your work in setting up the symbology reside only in the mxd (and you maybe save a backup of it in case you change things). I have a graphical answer covering those steps over here. – Chris W Jul 23 '14 at 23:19
  • Good catch on the weird units for the lower left result. I think that was an artifact of my attempts to manually define the ranges, and I defined them in reverse order. The use of 'to' instead of '-' is also a good one. The problem I have with your original solution is that it requires a lot of manual work with coloring and labeling, and I need to generate a series of these figures. Your alternative solution gave me some ideas, though. I think I found a way to make it a bit more elegant and remove the issues of the minimum value. – hfisch Jul 24 '14 at 14:56
3
  1. Choose the number of classes you want.
  2. Right click on the symbols and select save class breaks
  3. this saves an xml file you can open and edit in any text-editor
  4. edit the class breaks you want in the xml file and save
  5. right click on the symbols again and import the newly edited class breaks file

DONE

2

I believe this is about feature legend but not rasters. If this is about rasters disregard my suggestion. I usually use these:

  • Merge 2 (or more shapefiles) CHILDS into one, let's call it FAMILY
  • create legend for FAMILY
  • import symbology for every CHILD from FAMILY

Hope it helps, FP

  • Just realise it is very similar to JWallace – FelixIP Jul 24 '14 at 6:46
2

An easier but also dirtier solution that has worked for me. Don't forget to create a backup of your original data.

  1. Open the Attribute Table and Start Editing
  2. Edit any two values manually so the minimum and the maximum value you want your classification to be based on are included (remember the original values)
  3. Save and Stop Editing
  4. Classify based on the new extrema
  5. Start over and manually replace the altered values with the original values
  6. The existing classification won't be affected
2

I did the following workaround. I created my own class breaks in an XML document and loaded it to the classified symbology of both layers.

  1. To get a template of a class breaks-XML-document: in the layer properties click right on the range of classification and then "save class breaks".
  2. Edit XML document: enter the breaks of classes in the XML document, you can also enter numbers that will be out of range of your datasets.
  3. Load XML class breaks: same menue where you saved the template (see 1), click "load class breaks"

    Step 1 and 3

Step 2

1

An alternate way is to combine all the values from each layer into one layer, using this way you will have the minimum and maximum values in on layer.

The illustration:
1.combine the values from all layers into one column (let's name it as All_Vals) in an excel sheet

  1. next to the All_Vals column add two new columns named as X and Y and fill them with zeros.

  2. In arcmap add the excel sheet as a table and use it to create a point feature class by using display xy data command/tool then export the event layer to a shapefile ( I'll name it NB_Point) and add it to the data frame.

4 . Convert the NB_Point shape file to much the feature class type of your layers, for example if the type of your feature layer is polygone, use the buffer tool to create polygone feature class from the NB_Point shapefile (let's name it as NB_polygon).

  1. Now you all you have to do is to right-click the final layer NB_polygon and apply the graduated color symbology using natural breaks classification, export it to a .lyr file to use it as the input layer when using the import layer symbology utility for each of the original layers.

Hope this helps and sorry for any misspelling.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.