******************************************************************************** * Description of the Program - * * This program is a tool to facilitate Stata users developing graph schemes * * using research-based color palettes. Unlike other uses of the color * * palettes developed by Brewer (see References below), this program allows * * users to specify the number of colors from any of the 35 color palettes they * * would like to use and allows users to mix/combine different palettes for the * * various graph types. * * * * Data Requirements - * * none * * * * System Requirements - * * none * * * * Program Output - * * scheme-`schemename'.scheme * * * * Lines - * * 1561 * * * ******************************************************************************** *! brewscheme *! v 1.0.0 *! 21MAR2016 // Drop the program from memory if loaded cap prog drop brewscheme // Define the program as an rclass program prog def brewscheme, rclass // Specify the version number version 13.1 // Define the syntax structure of the program syntax , SCHEMEname(string asis) /// [ ALLSTyle(string asis) ALLColors(real 3) ALLSATuration(real 100) /// BARSTyle(string asis) BARColors(real 3) BARSATuration(real 100) /// SCATSTyle(string asis) SCATColors(real 3) SCATSATuration(real 100) /// AREASTyle(string asis) AREAColors(real 3) AREASATuration(real 100) /// LINESTyle(string asis) LINEColors(real 3) LINESATuration(real 100) /// BOXSTyle(string asis) BOXColors(real 3) BOXSATuration(real 100) /// DOTSTyle(string asis) DOTColors(real 3) DOTSATuration(real 100) /// PIESTyle(string asis) PIEColors(real 3) PIESATuration(real 100) /// SUNSTyle(string asis) SUNColors(real 4) SUNSATuration(real 100) /// HISTSTyle(string asis) HISTColors(real 3) HISTSATuration(real 100) /// CISTyle(string asis) CIColors(real 3) CISATuration(real 100) /// MATSTyle(string asis) MATColors(real 3) MATSATuration(real 100) /// REFLSTyle(string asis) REFLColors(real 3) REFLSATuration(real 100) /// REFMSTyle(string asis) REFMColors(real 3) REFMSATuration(real 100) /// CONSTart(string asis) CONEnd(string asis) CONSATuration(real 100) /// SOMESTyle(string asis) SOMEColors(real 3) SOMESATuration(real 100) /// REPlace DBug THEMEFile(string asis) SYMBols(string asis) ] // Check for brewscheme Mata library qui: brewlibcheck // Define local with valid symbols arguments loc validsymbols circle diamond triangle square plus smcircle /// smdiamond smsquare smtriangle smplus smx circle_hollow /// diamond_hollow triangle_hollow square_hollow smcircle_hollow /// smdiamond_hollow smtriangle_hollow smsquare_hollow point none // Check for symbols argument if `"`symbols'"' != "" { // Get the number of symbols passed loc numsymbols `: word count `symbols'' // Loop over symbols forv i = 1/`numsymbols' { // Get the individual symbol argument loc thissymbol `: word `i' of `symbols'' // Check if valid symbol if `: list thissymbol in validsymbols' == 0 { // Display error message in the console di as err `"The argument `thissymbol' passed to the "' /// "symbols parameter is invalid. Must be one of "' /// `"`: subinstr loc validsymbols `" "' `", "', all'."' // Issue generic error code err 198 } // End IF Block for argument validation } // End Loop over symbols arguments for validation } // End IF Block to validate symbol arugments // If no argument passed default to circle else { // Set number of symbols local loc numsymbols = 1 // Set symbols to default to circle loc symbols circle } // End ELSE Block for null symbols parameter // Preserve data currently loaded in memory preserve // Check for directory and if not build it dirfile, p(`"`c(sysdir_personal)'b"') // Check for subdirectory used for storing scheme files dirfile, p(`"`c(sysdir_plus)'s"') // Check for the metadata dataset cap confirm new file `"`c(sysdir_personal)'b/brewmeta.dta"' // If file doesn't exist if inlist(_rc, 0, 603) { // Call brewmeta to build lookup data set qui: brewdb, `replace' // Load the lookup table qui: use `"`c(sysdir_personal)'b/brewmeta.dta"', clear } // End IF Block to build look up data set // Check for file cap confirm new file `"`c(sysdir_personal)'b/brewmeta.dta"' // If file doesn't exist if inlist(_rc, 0, 603) | "`replace'" != "" { // Call brewmeta to build lookup data set qui: brewdb, `replace' // Load the lookup table qui: use `"`c(sysdir_personal)'b/brewmeta.dta"', clear } // End IF Block to build look up data set // If the file exists load it else { // Load the lookup table qui: use `"`c(sysdir_personal)'b/brewmeta.dta"', clear } // End ELSE Block to load brewmeta file // Get acceptable palette names qui: levelsof palette, loc(palettes) // Initialize a new brewcolors class qui: mata: brewc = brewcolors() // Loop over the palette names foreach v of loc palettes { // Get the maximum number of colors available in the palette qui: su maxcolors if palette == `"`v'"', meanonly // Store in the macro with the name of the palette followed by c loc `v'c = `r(mean)' } // End Loop to get maximum number of colors per palette // Set local with the graph type stub names loc gr1 bar scat area line con box dot pie loc gr2 sun hist ci mat refl refm loc grstyles `gr1' `gr2' /* Validate arguments (if all graph types are null, an all parameter must be specified */ if mi("`barstyle'") & mi("`scatstyle'") & mi("`areastyle'") & /// mi("`linestyle'") & mi("`constart'") & mi("`boxstyle'") & /// mi("`dotstyle'") & mi("`piestyle'") & mi("`sunstyle'") & /// mi("`histstyle'") & mi("`cistyle'") & mi("`matstyle'") & /// mi("`reflstyle'") & mi("`refmstyle'") & mi("`allstyle'") & /// mi("`conend'") { // Print error message to the screen di as err "Must include either arguments for the all " /// "parameters or use a combination of graph type arguments and " /// "some arguments to provide default colors to the other graph types" // Kill the program exit } // End IF Block for valid arguments // If all the graph styles are missing and an all style is specified else if mi("`barstyle'") & mi("`scatstyle'") & mi("`areastyle'") & /// mi("`linestyle'") & mi("`boxstyle'") & mi("`dotstyle'") & /// mi("`piestyle'") & mi("`sunstyle'") & mi("`histstyle'") & /// mi("`cistyle'") & mi("`matstyle'") & mi("`reflstyle'") & /// mi("`refmstyle'") & mi("`constart'") & mi("`conend'") & /// !mi("`allstyle'") { // Checks the saturation values and returns valid value if // invalid argument is passed checkSat, int(`allsaturation') // Resets the local to the corrected value loc allsaturation = `r(saturation)' // Set the style parameters for all graph types to the values in the // all parameters if `allcolors' <= ``allstyle'c' { // Check to see if all style was an available palette if `: list allstyle in palettes' != 1 { // Let user know valid values di as err `"Styles arguments must be one of: `palettes'"' // Exit program exit } // End IF Block to check for valid color palette // Loop over graph types and assign the all styles to them foreach stile in "bar" "scat" "area" "line" "box" /// "dot" "pie" "sun" "hist" "ci" "mat" "refl" "refm" { /* Assign the all style, color, and saturation levels to the individual graph types. */ loc `stile'style `allstyle' loc `stile'colors `allcolors' loc `stile'saturation `allsaturation' } // End Loop over graph types // Sets the palette for the starting color for contourplots loc constart `allstyle' // Sets the palette for the ending color for contourplots loc conend `allstyle' } // End IF Block to check if the # of colors is valid for the style // If the user selected more colors than available in the palette else { // Print error message to the screen di as err `"More colors (`allcolors') than "' /// `"available (``allstyle'c') in the palette `allstyle'"' // Kill the program exit } // End ELSE Block for # colors > available colors } // End ELSEIF Block for missing graph styles with nonmissing all style // If missing some arguments make sure some parameters have values else if ("`barstyle'" == "" | "`scatstyle'" == "" | /// "`areastyle'" == "" | "`linestyle'" == "" | /// "`boxstyle'" == "" | "`dotstyle'" == "" | /// "`piestyle'" == "" | "`sunstyle'" == "" | /// "`histstyle'" == "" | "`cistyle'" == "" | /// "`matstyle'" == "" | "`reflstyle'" == "" | /// "`refmstyle'" == "" | "`constart'" == "" | "`conend'" == "") & /// "`somestyle'" == "" { // If missing some graph type styles must include defaults in some di as err "Must include arguments for somestyle if missing graph types" // Kill program exit } // End ELSEIF Block for missing types w/o some argument // If missing some graph types and defaults provided else if ("`barstyle'" == "" | "`scatstyle'" == "" | /// "`areastyle'" == "" | "`linestyle'" == "" | /// "`boxstyle'" == "" | "`dotstyle'" == "" | /// "`piestyle'" == "" | "`sunstyle'" == "" | /// "`histstyle'" == "" | "`cistyle'" == "" | /// "`matstyle'" == "" | "`reflstyle'" == "" | /// "`refmstyle'" == "" | "`constart'" == "" | "`conend'" == "") & /// "`somestyle'" != "" { // Check to see if some style was an available palette if `: list somestyle in palettes' != 1 { // Let user know valid values di as err "Styles arguments must be one of: " _n `"`palettes'"' // Exit program exit } // End IF Block to check for valid color palette // Tests the saturation value for the some option checkSat, int(`somesaturation') // Returns the corrected values to the same local loc somesaturation = `r(saturation)' // If more colors specified for default than available if `somecolors' > ``somestyle'c' & `somecolors' != . { // Print error message to screen di as err `"More colors (``stile'colors') than "' /// `"available (``stile'style') in the palette "' /// `""`stile'style" = ``somestyle'c'"' // Kill the program err 198 } // End ELSEIF Block for # colors > available for defaults // Loop over # available colors per graph foreach stile in `grstyles' { // Check contour plot scheme arguments if `"``stile'start'"' == "" loc constart "`somestyle'" if `"``stile'end'"' == "" loc conend "`somestyle'" // If the style is missing and valid # colors for default if "``stile'style'" == "" { // Assign the default styles to the graph type loc `stile'style "`somestyle'" loc `stile'colors `somecolors' loc `stile'saturation `somesaturation' } // End IF Block for unspecified graphs // If the graph type has a style specified else { // Check to see if there are the requested number of colors if ``stile'colors' > ```stile'style'c' { // If not print error to screen di as err `"Too many colors specified in "' /// `"`stile'colors(``stile'colors') for the "' /// `"``stile'style' palette."' _n /// `"Maximum number of colors allowed is ```stile'style'c'"' // Issue error code and exit err 198 } // End IF Block for more colors than available // If there are an appropriate number of colors requested else { // Check the saturation values checkSat, int(``stile'saturation') // And replace the passed argument with the validated value loc `stile'saturation = `r(saturation)' } // End ELSE Block for sufficient colors } // End ELSE Block for graphs with specified color palettes } // End Loop over graph types } // End ELSEIF Block for valid parameters // For cases where all styles are specified else { // Loop over # available colors per graph foreach stile in `grstyles' { // Skip over contour plot case if `"`stile'"' == "con" continue // Check to see if there are the requested number of colors else if ``stile'colors' > ```stile'style'c' { // If not print error to screen di as err `"Too many colors specified in "' /// `"`stile'colors(``stile'colors') for the "' /// `"``stile'style' palette."' _n /// `"Maximum number of colors allowed is ```stile'style'c'"' // Issue error code and exit err 198 } // End ELSEIF Block for more colors than available // If there are an appropriate number of colors requested else { // Check the saturation values checkSat, int(``stile'saturation') // And replace the passed argument with the validated value loc `stile'saturation = `r(saturation)' } // End ELSE Block for sufficient colors } // End Loop over graph types } // End ELSE Block for cases with all graph types specified // Line saturation gets defined as a color multiplier // loc linesaturation = `linesaturation'/100 // Dot plot saturation is defined as a color multiplier // loc dotsaturation = `dotsaturation'/100 // Scatterplot saturation gets defined as a color multiplier // loc scatsaturation = `scatsaturation'/100 // Use a tempname for the scheme file filehandle tempname scheme1 scheme2 scheme3 scheme4 scheme5 // Root file path to theme files loc themeroot `"`c(sysdir_personal)'b/theme/theme"' // Root file path for brewscheme created scheme files loc schemeroot `"`c(sysdir_plus)'/s/scheme"' // Write the scheme file to a location on the path qui: file open `scheme1' using `"`schemeroot'-`schemename'.scheme"', w replace qui: file open `scheme2' using /// `"`schemeroot'-`schemename'_achromatopsia.scheme"', w replace qui: file open `scheme3' using /// `"`schemeroot'-`schemename'_protanopia.scheme"', w replace qui: file open `scheme4' using /// `"`schemeroot'-`schemename'_deuteranopia.scheme"', w replace qui: file open `scheme5' using /// `"`schemeroot'-`schemename'_tritanopia.scheme"', w replace // Find maximum number of colors to set the recycle parameter loc pcycles = max( `barcolors', `scatcolors', `areacolors', /// `linecolors', `boxcolors', `dotcolors', /// `piecolors', `suncolors', `histcolors', /// `cicolors', `matcolors', `reflcolors', /// `refmcolors') // Recycle the number of symbols qui: mata: recycle(`numsymbols', `pcycles') // Loop over the sequence of symbols foreach symb in `sequence' { // Build a string with each of the symbols corresponding to the // appropriate cycle number loc symbolseq `"`symbolseq' "`: word `symb' of `symbols''""' } // End Loop over symbol sequence // Check to see if start and end contour color palettes are the same if `"`constart'"' == `"`conend'"' { // Get version of palette w/minimum number of colors qui: su pcolor if palette == `"`constart'"' // Get the first value from the palette as the start of the contour qui: levelsof rgb if palette == `"`constart'"' & /// pcolor == `r(min)', loc(cstart) // Overwrite the local macro with the RGB value loc constart `: word 1 of `cstart'' // Overwrite the local macro with the RGB value loc conend `: word 2 of `cstart'' } // End IF Block for case where contour start/end use same palette // If they use different palettes else { // Get version of palette with minimum number of colors for start qui: su pcolor if palette == `"`constart'"' // Get the first value from the palette as the start of the contour qui: levelsof rgb if palette == `"`constart'"' & /// pcolor == `r(min)', loc(cstart) // Overwrite the local macro with the RGB value loc constart `: word 1 of `cstart'' // Get version of palette with minimum number of colors for start qui: su pcolor if palette == `"`conend'"' // Get the first value from the palette as the end of the contour qui: levelsof rgb if palette == `"`conend'"' & /// pcolor == `r(min)', loc(cend) // Overwrite the local macro with the RGB value second word used here // to prevent same color issue if the allstyle option is used. loc conend `: word 2 of `cend'' } // End ELSE Block for separate start/end contour palettes // Recycle the number of symbols qui: mata: recycle(`numsymbols', `pcycles') // Loop over the sequence of symbols foreach symb in `sequence' { // Build a string with each of the symbols corresponding to the // appropriate cycle number loc symbolseq `"`symbolseq' "`: word `symb' of `symbols''""' } // End Loop over symbol sequence // Loop over color macros foreach color in bar scat area line box dot pie hist ci mat /// refl refm sun { /* Create the sequence of color ids for each graph type based on the maximum number of colors in any listed color argument. */ qui: mata: recycle(``color'colors', `pcycles') // Assign the id sequence to a local with seq as suffix loc `color'seq = `"`sequence'"' // Get RGB values for a given palette and max colors qui: levelsof rgb if palette == "``color'style'" & /// pcolor == ``color'colors', loc(rgbs) // If the RGB value macro is null get the values for the maxmimum // number of colors available for the palette if `"`rgbs'"' == "" { // Gets the same palette but with the maximum number of colors qui: levelsof rgb if palette == "``color'style'" & /// pcolor == ```color'style'c', loc(rgbs) } // End IF Block for palettes that only have a single set of colors // Developer option to print debug messages if "`dbug'" != "" { // Prints the graph type with data that follows di "Graph type = `color'" // Print debugging message di "Color: `color'" _n "Number of colors: ``color''" _n /// `"Color sequence: ``color'seq'"' } // End Debug messages // Loop over the rgb values to construct the graph specific // rgb values foreach c of loc `color'seq { // Construct macro with RGB values for lookup loc `color'rgb `"``color'rgb' "`: word `c' of `rgbs''" "' } // End Loop // Create marker for graph type with maximum number of colors if ``color'colors' == `pcycles' { // Set the generic color macro to reference macro w/max colors loc gencolor `"``color'rgb'"' } // End of IF Block to define generic color macro // Check for debug option if "`dbug'" != "" { // Print the RGB color string to screen di `"``color'rgb'"' } // End debug option } // End Loop over number of colors for graph types // Stubs to use for line references to theme files loc linerefs theme1 theme2 theme3 theme4 theme5 // Tempnames tempname theme1 theme2 theme3 theme4 theme5 // Check for theme file if `"`themefile'"' != "" { // Themefile names loc themerefs `"`themeroot'-`themefile'.theme"' /// `"`themeroot'-`themefile'_achromatopsia.theme"' /// `"`themeroot'-`themefile'_protanopia.theme"' /// `"`themeroot'-`themefile'_deuteranopia.theme"' /// `"`themeroot'-`themefile'_tritanopia.theme"' // Loop over theme files forv thf = 1/5 { // Open the first file file open `theme`thf'' using `"`: word `thf' of `"`themerefs'"''"', r // zero value local macro loc x = 1 // Read the first line of the file file read `theme`thf'' theme`thf'_`x' // Loop until end of file while r(eof) == 0 { // Increment line counter loc x = `x' + 1 // Read line into local macro file read `theme`thf'' theme`thf'_`x' } // End Loop over theme file // Close the file connection file close `theme`thf'' } // End Loop over themefiles } // End IF Block for user specified theme file // If user does not specify a file else { // Check for default file cap confirm file `"`themeroot'-default.theme"' // If the default file exists if _rc != 0 { // Create the default brewtheme files qui: brewtheme } // End IF Block to open a connection to the default theme // Themefile names loc themerefs `"`themeroot'-default.theme"' /// `"`themeroot'-default_achromatopsia.theme"' /// `"`themeroot'-default_protanopia.theme"' /// `"`themeroot'-default_deuteranopia.theme"' /// `"`themeroot'-default_tritanopia.theme"' // Loop over theme files forv thf = 1/5 { // Open the first file file open `theme`thf'' using `"`: word `thf' of `"`themerefs'"''"', r // zero value local macro loc x = 1 // Read the first line of the file file read `theme`thf'' theme`thf'_`x' // Loop until end of file while r(eof) == 0 { // Increment line counter loc x = `x' + 1 // Read line into local macro file read `theme`thf'' theme`thf'_`x' } // End Loop over theme file // Close the file connection file close `theme`thf'' } // End Loop over themefiles } // End ELSE Block for null theme file // Name extension macros loc nameext "" "_achromatopsia" "_protanopia" "_deuteranopia" "_tritanopia" // Loop over the theme/scheme file pairs forv j = 1/5 { // Correction for schemenames if `j' == 1 loc schemelabel `"label "`schemename'""' // For all other cases else loc schemelabel `"label "`schemename'`: word `j' of `nameext''""' file write `scheme`j'' `"* s2color.scheme"' _n file write `scheme`j'' `""' _n file write `scheme`j'' `"* s2 scheme family with a naturally white background (white plotregions and"' _n file write `scheme`j'' `"* lightly colored background) and color foreground (lines, symbols, text, etc)."' _n file write `scheme`j'' `""' _n file write `scheme`j'' `"* For p[#][stub] scheme references the corresponding style is resolved by"' _n file write `scheme`j'' `"* searching the scheme ids with the following preference ordering:"' _n file write `scheme`j'' `"*"' _n file write `scheme`j'' `"* p#stub"' _n file write `scheme`j'' `"* pstub"' _n file write `scheme`j'' `"* p#"' _n file write `scheme`j'' `"* p"' _n file write `scheme`j'' `"*"' _n file write `scheme`j'' `"* Thus it is possible to control the selected style to great detail, or let it"' _n file write `scheme`j'' `"* default to common defaults. In particular -p- or -pstub- without"' _n file write `scheme`j'' `"* # can be used to designate a common plotting symbol, or back plotting"' _n file write `scheme`j'' `"* symbol, or for that matter common color or sizes."' _n file write `scheme`j'' `"*"' _n file write `scheme`j'' `"* "style"s designated "special" are not styles at all, but direct signals to"' _n file write `scheme`j'' `"* graphs, plots, or other classes and their parsers. Their contents are"' _n file write `scheme`j'' `"* specific to the use and may only be understood by the caller."' _n file write `scheme`j'' `""' _n file write `scheme`j'' `"*! version 1.2.5 16jun2011"' _n(2) file write `scheme`j'' `"sequence 1299"' _n file write `scheme`j'' `"`schemelabel'"' _n(2) file write `scheme`j'' `"system naturally_white 1"' _n(3) // Loop over first 10 lines of theme file forv i = 1/10 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End Loop over lines 1-10 of theme file file write `scheme`j'' `"numstyle pcycle `pcycles'"' _n(2) // Loop over lines 11-16 of the theme file forv i = 11/16 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 11-16 of the theme file file write `scheme`j'' `"numstyle contours `pcycles'"' _n(2) // Loop over lines 17-179 of the theme file forv i = 17/179 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 17-179 of the theme file } // End Loop over scheme/theme file pairs // Local with color type refs loc ctyperefs rgb achromatopsia protanopia deuteranopia tritanopia // Get the area1 rgb values mata: brewc.brewColorSearch("`: word 1 of `areargb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc ci_area`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Get the cysymbol rgb values mata: brewc.brewColorSearch("`: word 1 of `cirgb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc ci_symbol`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Get the area1 rgb values mata: brewc.brewColorSearch("`: word 2 of `areargb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc ci2_area`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Get the cysymbol rgb values mata: brewc.brewColorSearch("`: word 2 of `cirgb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc ci2_symbol`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Search for histogram color mata: brewc.brewColorSearch("`: word 1 of `histrgb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc histogram`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Search for generic sunflower plot color mata: brewc.brewColorSearch("`: word 1 of `sunrgb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc sunflower`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Search for generic light flower mata: brewc.brewColorSearch("`: word 2 of `sunrgb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc sunflowerlf`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Search for generic dark flower mata: brewc.brewColorSearch("`: word 3 of `sunrgb''") // Loop over macros forv rfs = 1/5 { // Store all the translated RGB values loc sunflowerdf`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over macro reassignments // Search for contour start values mata: brewc.brewColorSearch("`constart'") // Store the contour start values forv rfs = 1/5 { // Index values like other graph types loc constart`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over contour plot starting values // Search for contour end values mata: brewc.brewColorSearch("`conend'") // Store the contour end values forv rfs = 1/5 { // Index values like other graph types loc conend`rfs' ``: word `rfs' of `ctyperefs''' } // End Loop over contour plot ending values // Loop over scheme/theme file pairs forv j = 1/5 { file write `scheme`j'' `"color ci_line "0 0 0""' _n file write `scheme`j'' `"color ci_arealine "0 0 0""' _n file write `scheme`j'' `"color ci_area "`ci_area`j''" "' _n file write `scheme`j'' `"color ci_symbol "`ci_symbol`j''" "' _n file write `scheme`j'' `"color ci2_line "0 0 0""' _n file write `scheme`j'' `"color ci2_arealine "0 0 0""' _n file write `scheme`j'' `"color ci2_area "`ci2_area`j''" "' _n file write `scheme`j'' `"color ci2_symbol "`ci2_symbol`j''" "' _n(2) file write `scheme`j'' `"color pieline "0 0 0""' _n(2) // Writes line 180 from the theme file file write `scheme`j'' `theme`j'_180' // Writes line 181 from the theme file file write `scheme`j'' `theme`j'_181' file write `scheme`j'' `"color refmarker "0 0 0""' _n file write `scheme`j'' `"color refmarkline "0 0 0""' _n file write `scheme`j'' `"color histogram "`histogram`j''" "' _n // Writes line 182 from the theme file file write `scheme`j'' `theme`j'_182' file write `scheme`j'' `"color histogram_line "0 0 0""' _n file write `scheme`j'' `"color dot_line "0 0 0""' _n file write `scheme`j'' `"color dot_arealine "0 0 0""' _n file write `scheme`j'' `"color dot_area "`ci_area`j''" "' _n file write `scheme`j'' `"color dotmarkline "0 0 0""' _n(2) file write `scheme`j'' `"color xyline "0 0 0""' _n file write `scheme`j'' `"color refline "0 0 0""' _n file write `scheme`j'' `"color dots "0 0 0""' _n(2) // Loop over lines 183-192 of the theme file forv i = 183/192 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 183-192 of the theme file // Check for values for starting/ending contour plots if "`constart`j''" == "" { loc constart purple } if "`conend`j''" == "" { loc conend orange } file write `scheme`j'' `"color contour_begin "`constart`j''""' _n file write `scheme`j'' `"color contour_end "`conend`j''""' _n file write `scheme`j'' `"color zyx2 "0 0 0""' _n(2) file write `scheme`j'' `"color sunflower "`sunflower`j''""' _n file write `scheme`j'' `"color sunflowerlb "0 0 0""' _n file write `scheme`j'' `"color sunflowerlf "`sunflowerlf`j''""' _n file write `scheme`j'' `"color sunflowerdb "0 0 0""' _n file write `scheme`j'' `"color sunflowerdf "`sunflowerdf`j''""' _n(2) file write `scheme`j'' `"color p gs6"' _n } // End Loop over theme/scheme pairs /* Add generic color loop here */ forv i = 1/`: word count `gencolor'' { // Look up color value mata: brewc.brewColorSearch("`: word `i' of `gencolor''") // Loop over macros / theme/scheme file pairs forv rfs = 1/5 { // Add entry to scheme files file write `scheme`rfs'' `"color p`i' "``: word `rfs' of `ctyperefs'''""' _n } // End Loop over theme/scheme file pairs } // End Loop for generic colors // Loop over theme/scheme file pairs forv j = 1/5 { // Write blank line to scheme file file write `scheme`j'' `""' _n // Loop over lines 193-331 of the theme file forv i = 193/331 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 193-331 of the theme file file write `scheme`j'' `"markerstyle p1"' _n file write `scheme`j'' `"markerstyle dots dots"' _n file write `scheme`j'' `"markerstyle star star"' _n file write `scheme`j'' `"markerstyle histogram histogram"' _n file write `scheme`j'' `"markerstyle ci ci"' _n file write `scheme`j'' `"markerstyle ci2 ci2"' _n file write `scheme`j'' `"markerstyle ilabel ilabel"' _n file write `scheme`j'' `"markerstyle matrix matrix"' _n file write `scheme`j'' `"markerstyle box_marker refmarker"' _n file write `scheme`j'' `"markerstyle editor editor"' _n file write `scheme`j'' `"markerstyle editor_arrow ed_arrow"' _n file write `scheme`j'' `"markerstyle sunflower sunflower"' _n(2) // Write generic marker styles foreach i in "" "box" "dot" "arrow" { // Loop over cycle numbers forv v = 1/`pcycles' { // Add entry to scheme file file write `scheme`j'' `"markerstyle p`v'`i' p`v'`i'"' _n } // End Loop over cycle number // Write blank line between each of the types file write `scheme`j'' `""' _n } // End Loop over marker style generic types // Add extra space after p#arrow file write `scheme`j'' `""' _n // Loop over lines 332-382 of the theme file forv i = 332/382 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 332-382 of the theme file // Shade/fill settings file write `scheme`j'' `"shadestyle foreground"' _n file write `scheme`j'' `"shadestyle background background"' _n file write `scheme`j'' `"shadestyle foreground foreground"' _n(2) file write `scheme`j'' `"shadestyle ci ci"' _n file write `scheme`j'' `"shadestyle ci2 ci2"' _n file write `scheme`j'' `"shadestyle histogram histogram"' _n file write `scheme`j'' `"shadestyle dendrogram dendrogram"' _n file write `scheme`j'' `"shadestyle dotchart dotchart"' _n file write `scheme`j'' `"shadestyle legend legend"' _n file write `scheme`j'' `"shadestyle clegend_outer clegend_outer"' _n file write `scheme`j'' `"shadestyle clegend_inner clegend_inner"' _n file write `scheme`j'' `"shadestyle clegend_preg none"' _n file write `scheme`j'' `"shadestyle plotregion plotregion"' _n file write `scheme`j'' `"shadestyle matrix_plotregion matrix_plotregion"' _n file write `scheme`j'' `"shadestyle sunflower sunflower"' _n file write `scheme`j'' `"shadestyle sunflowerlb sunflowerlb"' _n file write `scheme`j'' `"shadestyle sunflowerdb sunflowerdb"' _n file write `scheme`j'' `"shadestyle contour_begin contour_begin"' _n file write `scheme`j'' `"shadestyle contour_end contour_end"' _n(2) file write `scheme`j'' `"shadestyle p foreground"' _n(2) // Write generic marker styles foreach i in "" "bar" "box" "pie" "area" { // Loop over cycle numbers forv v = 1/`pcycles' { // Add entry to scheme file file write `scheme`j'' `"shadestyle p`v'`i' p`v'`i'"' _n } // End Loop over cycle number // Spaces between graph types if "`i'" != "area" { // Write blank line between each of the types file write `scheme`j'' `""' _n } // End IF Block for other graphtypes // For area shade styles else { // This line files final area entry file write `scheme`j'' `"* shadestyle p#other p1"' _n(3) } // End Else Block for area shade styles } // End Loop over marker style generic types // Loop over lines 383-434 of the theme file forv i = 383/434 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 383-434 of the theme file // Write generic marker styles foreach i in "" "bar" "box" "area" "line" "other" "mark" /// "boxmark" "dotmark" "arrow" "arrowline" "sunflowerlight" /// "sunflowerdark" { // Loop over cycle numbers forv v = 1/`pcycles' { // Check for sunflower cases if !inlist(`"`i'"', "sunflowerlight", "sunflowerdark") { // Add entry to scheme file file write `scheme`j'' `"linestyle p`v'`i' p`v'`i'"' _n } // End If Block for non sunflower plots // For the sunflower caes else { // Use the generic line style for the sunflower plots file write `scheme`j'' `"linestyle p`v'`i' p`v'"' _n } // End ELSE Block for sunflower plots } // End Loop over cycle number // Write blank line between each of the types file write `scheme`j'' `""' _n } // End Loop over marker style generic types // Loop over lines 435-494 of the theme file forv i = 435/494 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 435-494 of the theme file // Settings for color saturation file write `scheme`j'' `"intensity full"' _n file write `scheme`j'' `"intensity foreground inten100"' _n file write `scheme`j'' `"intensity background inten100"' _n(2) file write `scheme`j'' `"intensity symbol inten`scatsaturation'"' _n file write `scheme`j'' `"intensity ci_area inten`cisaturation'"' _n file write `scheme`j'' `"intensity histogram inten`histsaturation'"' _n file write `scheme`j'' `"intensity dendrogram inten`linesaturation'"' _n file write `scheme`j'' `"intensity dot_area inten`dotsaturation'"' _n file write `scheme`j'' `"intensity sunflower inten`sunsaturation'"' _n(2) file write `scheme`j'' `"intensity bar inten`barsaturation'"' _n file write `scheme`j'' `"intensity bar_line inten`linesaturation'"' _n file write `scheme`j'' `"intensity box inten`boxsaturation'"' _n file write `scheme`j'' `"intensity box_line inten`linesaturation'"' _n file write `scheme`j'' `"intensity pie inten`piesaturation'"' _n(2) file write `scheme`j'' `"intensity legend inten100"' _n file write `scheme`j'' `"intensity plotregion inten100"' _n file write `scheme`j'' `"intensity matrix_plotregion inten`matsaturation'"' _n(2) file write `scheme`j'' `"intensity clegend inten100"' _n file write `scheme`j'' `"intensity clegend_outer inten100"' _n file write `scheme`j'' `"intensity clegend_inner inten100"' _n(3) file write `scheme`j'' `"intensity p inten`scatsaturation'"' _n file write `scheme`j'' `"* intensity p# inten80"' _n file write `scheme`j'' `"* intensity p#shade inten80"' _n file write `scheme`j'' `"* intensity p#bar inten80 // twoway bar only, graph bar overall"' _n file write `scheme`j'' `"* intensity p#box inten80 // unused, overall only, control w/ color"' _n file write `scheme`j'' `"* intensity p#pie inten80 // unused, overall only, control w/ color"' _n file write `scheme`j'' `"* intensity p#area inten80"' _n(3) file write `scheme`j'' `"fillpattern pattern10"' _n file write `scheme`j'' `"fillpattern foreground pattern10"' _n file write `scheme`j'' `"fillpattern background pattern10"' _n(3) // Loop over lines 495-536 of the theme file forv i = 495/536 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 495-536 of the theme file // Write generic marker styles foreach i in "" "boxlabel" { // Loop over cycle numbers forv v = 1/`pcycles' { // Add entry to scheme file file write `scheme`j'' `"textboxstyle p`v'`i' p`v'`i'"' _n } // End Loop over cycle number // Write blank line between each of the types file write `scheme`j'' `""' _n } // End Loop over marker style generic types file write `scheme`j'' `"* textboxstyle p15label xyz"' _n(3) // Loop over lines 537-590 of the theme file forv i = 537/590 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 537-590 of the theme file // Write generic marker styles foreach i in "" "bar" "box" "pie" "area" "sunflowerlight" /// "sunflowerdark" { // Loop over cycle numbers forv v = 1/`pcycles' { // Check for sunflower cases if !inlist(`"`i'"', "sunflowerlight", "sunflowerdark") { // Add entry to scheme file file write `scheme`j'' `"areastyle p`v'`i' p`v'`i'"' _n } // End If Block for non sunflower plots // For the sunflower caes else { // Use the generic line style for the sunflower plots file write `scheme`j'' `"areastyle p`v'`i' p`v'"' _n } // End ELSE Block for sunflower plots } // End Loop over cycle number // Write blank line between each of the types file write `scheme`j'' `""' _n } // End Loop over marker style generic types // Loop over lines 591-770 of the theme file forv i = 591/770 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 591-770 of the theme file // Write generic marker styles foreach i in "" "box" { // Loop over cycle numbers forv v = 1/`pcycles' { // Add entry to scheme file file write `scheme`j'' `"labelstyle p`v'`i' p`v'`i'"' _n } // End Loop over cycle number // Write blank line between each of the types file write `scheme`j'' `""' _n } // End Loop over marker style generic types file write `scheme`j'' `""' _n // Loop over lines 771-911 of the theme file forv i = 771/911 { // Write each line to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End loop over lines 771-911 of the theme file // Loop over color cycles forv i = 1/`pcycles' { // Add default entry for each color cycle file write `scheme`j'' `"zyx2style p`i' default"' _n } // End Loop over number of color cycles file write `scheme`j'' `"seriesstyle p1"' _n(2) file write `scheme`j'' `"seriesstyle dendrogram dendrogram"' _n(2) file write `scheme`j'' `"seriesstyle ilabel ilabel"' _n file write `scheme`j'' `"seriesstyle matrix matrix"' _n(2) // Write generic marker styles foreach i in "" "bar" "box" "pie" "area" "line" "dot" "arrow" { // Loop over cycle numbers forv v = 1/`pcycles' { // Add entry to scheme file file write `scheme`j'' `"seriesstyle p`v'`i' p`v'`i'"' _n } // End Loop over cycle number // Write blank line between each of the types file write `scheme`j'' `""' _n } // End Loop over marker style generic types // Loop over lines 912-976 of the theme file forv i = 912/976 { // Write each line from the theme file to the scheme file file write `scheme`j'' `theme`j'_`i'' } // End Loop over lines 912-976 of the theme file // Set generic parameters forv i = 1/`pcycles' { // Generic Sunflower plot styles if `i' == 1 { file write `scheme`j'' `"sunflowerstyle p1 sunflower"' _n } else { file write `scheme`j'' `"sunflowerstyle p`i' p`i'"' _n } } // End Generic parameters } // End Loop over theme/scheme file pairs // Write the Area Graph characteristics for the number of colors chosen forv i = 1/`pcycles' { // Get area color index value loc areaid `: word `i' of `areacolorsseq'' // Get bar color index value loc barid `: word `i' of `barcolorsseq'' // Get box plot color index value loc boxid `: word `i' of `boxcolorsseq'' // Get dot plot color index value loc dotid `: word `i' of `dotcolorsseq'' // Get line plot color index value loc lineid `: word `i' of `linecolorsseq'' // Get pie color index value loc pieid `: word `i' of `piecolorsseq'' // Get scatterplot color index value loc scatid `: word `i' of `scatcolorsseq'' // Get current symbol loc thissymbol `: word `i' of `symbolseq'' // Get the area colors mata: brewc.brewColorSearch("`: word `i' of `areargb''") // Store all the translated RGB values for area loc areacolor1 `rgb' loc areacolor2 `achromatopsia' loc areacolor3 `protanopia' loc areacolor4 `deuteranopia' loc areacolor5 `tritanopia' // Get the area colors mata: brewc.brewColorSearch("`: word `i' of `barrgb''") // Store all the translated RGB values for bar graphs loc barcolor1 `rgb' loc barcolor2 `achromatopsia' loc barcolor3 `protanopia' loc barcolor4 `deuteranopia' loc barcolor5 `tritanopia' // Get the area colors mata: brewc.brewColorSearch("`: word `i' of `boxrgb''") // Store all the translated RGB values for boxplots loc boxcolor1 `rgb' loc boxcolor2 `achromatopsia' loc boxcolor3 `protanopia' loc boxcolor4 `deuteranopia' loc boxcolor5 `tritanopia' // Get the area colors mata: brewc.brewColorSearch("`: word `i' of `dotrgb''") // Store all the translated RGB values for dot plots loc dotcolor1 `rgb' loc dotcolor2 `achromatopsia' loc dotcolor3 `protanopia' loc dotcolor4 `deuteranopia' loc dotcolor5 `tritanopia' // Get the area colors mata: brewc.brewColorSearch("`: word `i' of `linergb''") // Store all the translated RGB values for line graphs loc linecolor1 `rgb' loc linecolor2 `achromatopsia' loc linecolor3 `protanopia' loc linecolor4 `deuteranopia' loc linecolor5 `tritanopia' // Get the area colors mata: brewc.brewColorSearch("`: word `i' of `piergb''") // Store all the translated RGB values for pie graphs loc piecolor1 `rgb' loc piecolor2 `achromatopsia' loc piecolor3 `protanopia' loc piecolor4 `deuteranopia' loc piecolor5 `tritanopia' // Get the area colors mata: brewc.brewColorSearch("`: word `i' of `scatrgb''") // Store all the translated RGB values for scatterplots loc scatcolor1 `rgb' loc scatcolor2 `achromatopsia' loc scatcolor3 `protanopia' loc scatcolor4 `deuteranopia' loc scatcolor5 `tritanopia' // Check debug option if "`dbug'" != "" { di as res `"Color Sequence `i'"' _n /// `"Area `i' RGB `areacolor'"' _n /// `"Bar `i' RGB `barcolor'"' _n /// `"Box `i' RGB `boxcolor'"' _n /// `"Dot `i' RGB `dotcolor'"' _n /// `"Line `i' RGB `linecolor'"' _n /// `"Pie Slice `i' RGB `piecolor'"' _n /// `"Scatter `i' RGB `scatcolor'"' } // End IF Block for debugging option // Loop over theme/scheme file pairs forv j = 1/5 { /* Connected Plots */ // Primary connected plot entries file write `scheme`j'' `"color p`i'area "`areacolor`j''""' _n file write `scheme`j'' `"linewidth p`i'area vvthin"' _n file write `scheme`j'' `"linepattern p`i'area solid"' _n file write `scheme`j'' `"color p`i'arealine "`linecolor`j''""' _n file write `scheme`j'' `"intensity p`i'area inten`areasaturation'"' _n // Define scheme colors for bar graphs file write `scheme`j'' `"color p`i' "`barcolor`j''""' _n file write `scheme`j'' `"color p`i'bar "`barcolor`j''""' _n file write `scheme`j'' `"intensity p`i'bar inten`barsaturation'"' _n // file write `scheme1' `"areastyle p`i'bar p`i'bar"' _n file write `scheme`j'' `"seriesstyle p`i'bar p`i'bar"' _n file write `scheme`j'' `"color p`i'barline "0 0 0""' _n /* Box Plot Styles */ // Primary box plot entries file write `scheme`j'' `"color p`i'box "`boxcolor`j''""' _n file write `scheme`j'' `"intensity box inten`boxsaturation'"' _n file write `scheme`j'' `"linewidth p`i'box medthin"' _n file write `scheme`j'' `"linepattern p`i'box solid"' _n file write `scheme`j'' `"color p`i'boxline "0 0 0""' _n file write `scheme`j'' `"intensity box_line full"' _n file write `scheme`j'' `"symbol p`i'box `thissymbol'"' _n file write `scheme`j'' `"symbolsize p`i'box medium"' _n file write `scheme`j'' `"linewidth p`i'boxmark vthin"' _n file write `scheme`j'' `"color p`i'boxmarkfill "`scatcolor`j''""' _n file write `scheme`j'' `"color p`i'boxmarkline "0 0 0""' _n file write `scheme`j'' `"gsize p`i'boxlabel vsmall"' _n file write `scheme`j'' `"color p`i'boxlabel "0 0 0""' _n file write `scheme`j'' `"clockdir p`i'box 0"' _n // Composite entries for box plots file write `scheme`j'' `"linestyle p`i'box p`i'box"' _n file write `scheme`j'' `"linestyle p`i'boxmark p`i'boxmark"' _n file write `scheme`j'' `"markerstyle p`i'box p`i'box"' _n file write `scheme`j'' `"seriesstyle p`i'box p`i'box"' _n // Custom median and whisker entries file write `scheme`j'' `"medtypestyle boxplot line"' _n file write `scheme`j'' `"yesno custom_whiskers yes"' _n file write `scheme`j'' `"linestyle box_whiskers ci"' _n file write `scheme`j'' `"linestyle box_median refline"' _n file write `scheme`j'' `"markerstyle box_marker p`i'box"' _n /* Connected Plots */ // Primary connected plot entries file write `scheme`j'' `"color p`i'line "`linecolor`j''""' _n file write `scheme`j'' `"yesno p`i'cmissings no"' _n file write `scheme`j'' `"connectstyle p`i' direct"' _n // Composite entries for connected plots file write `scheme`j'' `"markerstyle p`i' p`i'"' _n file write `scheme`j'' `"seriesstyle p`i' p`i'"' _n file write `scheme`j'' `"linestyle p`i'connect p`i'"' _n file write `scheme`j'' `"linestyle p`i'mark p`i'line"' _n file write `scheme`j'' `"linewidth p`i' medium"' _n file write `scheme`j'' `"linepattern p`i'line solid"' _n /* Connected Plots */ // Primary connected plot entries file write `scheme`j'' `"color p`i'dotmarkfill "`dotcolor`j''""' _n file write `scheme`j'' `"linewidth p`i'dotmark vthin"' _n file write `scheme`j'' `"symbol p`i'dot `thissymbol'"' _n file write `scheme`j'' `"symbolsize p`i'dot medium"' _n // Composite entries for connected plots file write `scheme`j'' `"linestyle p`i'dotmark p`i'dotmark"' _n file write `scheme`j'' `"markerstyle p`i'dot p`i'dot"' _n file write `scheme`j'' `"seriesstyle p`i'dot p`i'dot"' _n /* Connected Plots */ // Primary connected plot entries file write `scheme`j'' `"color p`i'lineplot "`linecolor`j''""' _n file write `scheme`j'' `"linewidth p`i'lineplot medium"' _n file write `scheme`j'' `"linepattern p`i'lineplot solid"' _n file write `scheme`j'' `"connectstyle p`i' direct"' _n // Primary entries for scatter plots file write `scheme`j'' `"color p`i'pie "`piecolor`j''""' _n file write `scheme`j'' `"color p`i'pieline "0 0 0""' _n file write `scheme`j'' `"intensity pie inten`piesaturation'"' _n file write `scheme`j'' `"areastyle p`i'pie p`i'pie"' _n file write `scheme`j'' `"seriesstyle p`i'pie p`i'pie"' _n // Primary entries for scatter plots file write `scheme`j'' `"symbol p`i' `thissymbol'"' _n file write `scheme`j'' `"symbolsize p`i' medium"' _n file write `scheme`j'' `"color p`i'markline "0 0 0""' _n file write `scheme`j'' `"linewidth p`i'mark vthin"' _n file write `scheme`j'' `"color p`i'markfill "`scatcolor`j''""' _n file write `scheme`j'' `"color p`i'label "0 0 0""' _n file write `scheme`j'' `"clockdir p`i' 0"' _n // Secondary entries for scatter plots file write `scheme`j'' `"color p`i'shade "`scatcolor`j''""' _n file write `scheme`j'' `"intensity p`i'shade inten`scatsaturation'"' _n file write `scheme`j'' `"linewidth p`i'other vthin"' _n file write `scheme`j'' `"linepattern p`i'other solid"' _n file write `scheme`j'' `"color p`i'otherline "`linecolor`j''""' _n // Composite entries for scatter plots file write `scheme`j'' `"linestyle p`i'mark p`i'mark"' _n file write `scheme`j'' `"markerstyle p`i' p`i'"' _n file write `scheme`j'' `"labelstyle p`i' p`i'"' _n file write `scheme`j'' `"seriesstyle p`i' p`i'"' _n } // End Loop over theme/scheme file pairs } // End Loop to create scatterplot scheme file entries // Close and save the graph scheme file file close `scheme1' file close `scheme2' file close `scheme3' file close `scheme4' file close `scheme5' // Create loop to generate all of the returned values foreach metachar in `: char _dta[]' { // Return the characteristics in self names locals ret loc `metachar' = `"`: char _dta[`metachar']'"' } // End Loop to build returned macros // Return data in memory to user restore // Print reference to console di in green _n(2) `"For bugs/issues, please submit issues to: "' _n /// as res `"{browse "http://github.com/wbuchanan/brewscheme"}"' _n /// in green `"For additional information about the program visit: "' _n /// as res `"{browse "http://wbuchanan.github.io/brewscheme"}"' _n // End of Program end // Defines a subroutine used to check saturation parameter values prog def checkSat, rclass // Defines the syntax the program uses syntax, [ INTensity(integer 100) ] return clear // If color intensity is not a valid value if !inlist(`intensity', 0, 10, 20, 30, 40, 50, 60, 70, 80, /// 90, 100, 200) { // If if invalid value is <= 104 if `intensity' <= 104 { // Set the value to the nearest decile in [0, 100] loc saturation = round(`intensity', 10) } // End IF Block testing for saturation <= 104 // If saturation is > 104 else if `intensity' > 104 { // Set to max valid saturation value loc saturation = 200 } // End of ELSEIF Block for saturation > 104 // For some other cases else { // Print message to the results screen di "Setting saturation to 100" // Set value to full saturation loc saturation = 100 } // End ELSE Block for some other values of saturation } // End IF Block for somesaturation value validation // IF the value is one of the integers defined in the IF Block set the return // macro to the value else loc saturation = `intensity' // Return the corrected value ret loc saturation = `saturation' // End of subroutine to check intensity values end