在堆积条形图中使用自定义调色板
Using a Custom Color Palette in Stacked Bar Chart
所以我正在尝试创建一个堆叠条形图,其中图表的所有切片在整个程序中都将保持不变,但我不知道如何让 df.plot 使用自定义调色板。
我想确保如果我用这个程序做 20 种不同的报告,例如,Freeze 将始终是蓝色,而 Hail 将始终是白色。
请看下面的示例 - 首先,我正在为所有天气值创建一个自定义调色板。
当我使用 "paired" 调色板绘图时,效果很好,看起来如下:
这基本上就是我想要的,除了使用自定义调色板
然而,当我这样做时
df.plot(kind='bar', stacked=True,colormap=pal_weather)
我收到一个以以下结尾的错误:
C:\Anaconda3\lib\site-packages\pandas\tools\plotting.py in _get_standard_colors(num_colors, colormap, color_type, color)
157 if colormap is None:
158 raise ValueError("Colormap {0} is not recognized".format(cmap))
--> 159 colors = lmap(colormap, np.linspace(0, 1, num=num_colors))
160 elif color is not None:
161 if colormap is not None:
C:\Anaconda3\lib\site-packages\pandas\compat\__init__.py in lmap(*args, **kwargs)
116
117 def lmap(*args, **kwargs):
--> 118 return list(map(*args, **kwargs))
119
120 def lfilter(*args, **kwargs):
TypeError: 'dict' object is not callable
如有任何帮助,我们将不胜感激
谢谢!
示例代码如下:
weather=('Day','Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
pal_weather = dict(zip(weather, sns.color_palette("cubehelix", n_colors=len(weather))))
data1 = [[ "M", 66386, 174296, 75131, 577908, 32015],
[ "T", 58230, 381139, 78045, 99308, 160454],
[ "W", 89135, 80552, 152558, 497981, 603535],
[ "T", 78415, 81858, 150656, 193263, 69638],
[ "F", 139361, 331509, 343164, 781380, 52269]]
df = DataFrame(data=data1)
df.columns = ('Day','Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
df.plot(kind='bar', stacked=True,colormap='Paired')
试试我的解决方案:
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap
matplotlib.style.use('ggplot')
from pandas import DataFrame
weather = ('Day', 'Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
colors = sns.color_palette("cubehelix", n_colors=len(weather))
cmap1 = LinearSegmentedColormap.from_list("my_colormap", colors)
data1 = [["M", 66386, 174296, 75131, 577908, 32015],
["T", 58230, 381139, 78045, 99308, 160454],
["W", 89135, 80552, 152558, 497981, 603535],
["T", 78415, 81858, 150656, 193263, 69638],
["F", 139361, 331509, 343164, 781380, 52269]]
df = DataFrame(data=data1)
df.columns = weather
df = df.set_index('Day')
df.plot(kind='bar', stacked=True, colormap=cmap1)
plt.show()
输出:
所以我正在尝试创建一个堆叠条形图,其中图表的所有切片在整个程序中都将保持不变,但我不知道如何让 df.plot 使用自定义调色板。
我想确保如果我用这个程序做 20 种不同的报告,例如,Freeze 将始终是蓝色,而 Hail 将始终是白色。
请看下面的示例 - 首先,我正在为所有天气值创建一个自定义调色板。
当我使用 "paired" 调色板绘图时,效果很好,看起来如下:
这基本上就是我想要的,除了使用自定义调色板
然而,当我这样做时
df.plot(kind='bar', stacked=True,colormap=pal_weather)
我收到一个以以下结尾的错误:
C:\Anaconda3\lib\site-packages\pandas\tools\plotting.py in _get_standard_colors(num_colors, colormap, color_type, color)
157 if colormap is None:
158 raise ValueError("Colormap {0} is not recognized".format(cmap))
--> 159 colors = lmap(colormap, np.linspace(0, 1, num=num_colors))
160 elif color is not None:
161 if colormap is not None:
C:\Anaconda3\lib\site-packages\pandas\compat\__init__.py in lmap(*args, **kwargs)
116
117 def lmap(*args, **kwargs):
--> 118 return list(map(*args, **kwargs))
119
120 def lfilter(*args, **kwargs):
TypeError: 'dict' object is not callable
如有任何帮助,我们将不胜感激
谢谢!
示例代码如下:
weather=('Day','Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
pal_weather = dict(zip(weather, sns.color_palette("cubehelix", n_colors=len(weather))))
data1 = [[ "M", 66386, 174296, 75131, 577908, 32015],
[ "T", 58230, 381139, 78045, 99308, 160454],
[ "W", 89135, 80552, 152558, 497981, 603535],
[ "T", 78415, 81858, 150656, 193263, 69638],
[ "F", 139361, 331509, 343164, 781380, 52269]]
df = DataFrame(data=data1)
df.columns = ('Day','Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
df.plot(kind='bar', stacked=True,colormap='Paired')
试试我的解决方案:
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap
matplotlib.style.use('ggplot')
from pandas import DataFrame
weather = ('Day', 'Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
colors = sns.color_palette("cubehelix", n_colors=len(weather))
cmap1 = LinearSegmentedColormap.from_list("my_colormap", colors)
data1 = [["M", 66386, 174296, 75131, 577908, 32015],
["T", 58230, 381139, 78045, 99308, 160454],
["W", 89135, 80552, 152558, 497981, 603535],
["T", 78415, 81858, 150656, 193263, 69638],
["F", 139361, 331509, 343164, 781380, 52269]]
df = DataFrame(data=data1)
df.columns = weather
df = df.set_index('Day')
df.plot(kind='bar', stacked=True, colormap=cmap1)
plt.show()
输出: