6

I hope to change the color palette for stackplot so that the large area has a light color, the smaller area has a bright color.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm
import matplotlib as mpl
import matplotlib.font_manager as font_manager

file = r'E:\FD\Barren_Mudflat\ChinaCoastal\Provinces\0ProvinceStat.csv'
#set font property of legend
font1 = {'family' : 'Times New Roman',  
'weight' : 'normal',  
'size'   : 16
} 

#read csv
dat1 = pd.read_csv(file)
dat2 = dat1.iloc[:,0:12]
Year = dat2.iloc[:,0]
Mud = dat2.iloc[:,1:12]
Mud = Mud/1000.0

#read columns of dataframe
vol = Mud.columns

#transpose mud
mud2 = Mud.T


%matplotlib qt5

#set size of figure
fig, ax = plt.subplots()
fig.set_size_inches(15, 7.5)

#read values of dataframe
value = mud2.values
#plot stack area
sp = ax.stackplot(Year, value)
#set legend
proxy = [mpl.patches.Rectangle((0,0), 0,0, facecolor=pol.get_facecolor()[0]) 
for pol in sp]
ax.legend(proxy, vol,prop = font1, loc='upper left', bbox_to_anchor= 
(0.01,1), ncol = 6)

plt.xlim(1986,2016)
plt.xticks([1986,1991,1996,2001,2006,2011,2016],fontproperties='Times New 
Roman', size = '16')
plt.xlabel('Year',fontproperties='Times New Roman', size = '18')
plt.ylim(0,1400)
plt.yticks(np.arange(0,1500,200),fontproperties='Times New Roman', size = 
'16')
plt.ylabel('Mudflat area (thousand ha)',fontproperties='Times New Roman', 
size = '18')

#save fig: run this code before show()
plt.savefig(r"E:\FD\Barren_Mudflat\ChinaCoastal\Provinces\stackplot.jpg", 
dpi = 600)
plt.show()

This is the result of the code. I hope to change the red into a light color, but I don't know how to change the default color pallete.

4 Answers 4

6

For anyone like me finding this thread somewhat later than creation.

It is possible to set custom colors by HEX color codes.

E.g.

color_map = ["#9b59b6", "#e74c3c", "#34495e", "#2ecc71"]

Then plot:

ax.stackplot(x, y, colors = color_map)

As a last note it is also possible to convert RGB colors to HEX colors (which I had to do in my case). As follows:

rgb_code = [128, 128, 128]
hex_color = '#%02x%02x%02x' % (rgb_code[0], rgb_code[1], rgb_code[2])
Sign up to request clarification or add additional context in comments.

Comments

4
col = sns.color_palette("hls", 11)
sp = ax.stackplot(Year, value, colors = col)

Comments

2

If wanting a more graded look, can also set proportionately from a color ramp

# user to specify
source = stack_lst # list of units to be stacked
pct_max = 95 # for example, max percentile of color ramp
pct_min = 20 # for example, min percentile of color ramp
ramp = plt.cm.viridis # for example

# number of items in data source
n = len(source)

# list of values between 0.00 and 1.00; length equals length of data source
n_prop = list(i / 100.0 for i in (np.arange(pct_min, pct_max, (pct_max-pct_min)/n)))

# create list of colors
clr_lst = []
for i in n_prop:
    clr = ramp(i) 
    clr_lst.append(clr)

then,

ax.stackplot(x, y, colors = clr_lst)

enter image description here

Comments

0
col = matplotlib.cm.Blues(np.linspace(0.5, 1, len(df.columns)))
plt.stackplot(df.index, *df.T.values, labels = df.columns, colors = col)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.