Matplotlib 条形图--按列指定条形图颜色
是否有一种简单的方法可以使用PandasMatplotlib 条形图--按列指定条形图颜色,matplotlib,pandas,Matplotlib,Pandas,是否有一种简单的方法可以使用PandasDataFrame.plot(kind='bar')方法通过列名指定条形图的颜色 我有一个脚本,它从目录中的几个不同数据文件生成多个数据帧。例如,它可以执行以下操作: import numpy as np import matplotlib.pyplot as plt import pandas as pds data_files = ['a', 'b', 'c', 'd'] df1 = pds.DataFrame(np.random.rand(4,3
DataFrame.plot(kind='bar')
方法通过列名指定条形图的颜色
我有一个脚本,它从目录中的几个不同数据文件生成多个数据帧。例如,它可以执行以下操作:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pds
data_files = ['a', 'b', 'c', 'd']
df1 = pds.DataFrame(np.random.rand(4,3), columns=data_files[:-1])
df2 = pds.DataFrame(np.random.rand(4,3), columns=data_files[1:])
df1.plot(kind='bar', ax=plt.subplot(121))
df2.plot(kind='bar', ax=plt.subplot(122))
plt.show()
具有以下输出:
不幸的是,不同绘图中每个标签的列颜色不一致。是否可以传入(文件名:颜色)的字典,以便任何特定列始终具有相同的颜色。例如,我可以想象通过使用Matplotlib color_循环压缩文件名来创建:
data_files = ['a', 'b', 'c', 'd']
colors = plt.rcParams['axes.color_cycle']
print zip(data_files, colors)
[('a', u'b'), ('b', u'g'), ('c', u'r'), ('d', u'c')]
我可以直接用Matplotlib解决这个问题:我只是觉得可能有一个更简单的内置解决方案
编辑:
下面是在纯Matplotlib中工作的部分解决方案。然而,我在一个IPython笔记本中使用了它,该笔记本将分发给非程序员同事,我希望尽量减少过多的绘图代码
import numpy as np
import matplotlib.pyplot as plt
import pandas as pds
data_files = ['a', 'b', 'c', 'd']
mpl_colors = plt.rcParams['axes.color_cycle']
colors = dict(zip(data_files, mpl_colors))
def bar_plotter(df, colors, sub):
ncols = df.shape[1]
width = 1./(ncols+2.)
starts = df.index.values - width*ncols/2.
plt.subplot(120+sub)
for n, col in enumerate(df):
plt.bar(starts + width*n, df[col].values, color=colors[col],
width=width, label=col)
plt.xticks(df.index.values)
plt.grid()
plt.legend()
df1 = pds.DataFrame(np.random.rand(4,3), columns=data_files[:-1])
df2 = pds.DataFrame(np.random.rand(4,3), columns=data_files[1:])
bar_plotter(df1, colors, 1)
bar_plotter(df2, colors, 2)
plt.show()
您可以将列表作为颜色传递。这将需要一点手工工作,让它排列整齐,不像你可以通过字典,但可能是一个不太混乱的方式来完成你的目标
import numpy as np
import matplotlib.pyplot as plt
import pandas as pds
data_files = ['a', 'b', 'c', 'd']
df1 = pds.DataFrame(np.random.rand(4,3), columns=data_files[:-1])
df2 = pds.DataFrame(np.random.rand(4,3), columns=data_files[1:])
color_list = ['b', 'g', 'r', 'c']
df1.plot(kind='bar', ax=plt.subplot(121), color=color_list)
df2.plot(kind='bar', ax=plt.subplot(122), color=color_list[1:])
plt.show()
编辑
Ajean想出了一个简单的方法从字典中返回正确颜色的列表:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pds
data_files = ['a', 'b', 'c', 'd']
color_list = ['b', 'g', 'r', 'c']
d2c = dict(zip(data_files, color_list))
df1 = pds.DataFrame(np.random.rand(4,3), columns=data_files[:-1])
df2 = pds.DataFrame(np.random.rand(4,3), columns=data_files[1:])
df1.plot(kind='bar', ax=plt.subplot(121), color=map(d2c.get,df1.columns))
df2.plot(kind='bar', ax=plt.subplot(122), color=map(d2c.get,df2.columns))
plt.show()
Pandas版本1.1.0使这变得更容易。您可以传递字典,为pandas.DataFrame.plot.bar()函数中的每列指定不同的颜色: 以下是一个例子:
df1 = pd.DataFrame({'a': [1.2, .8, .9], 'b': [.2, .9, .7]})
df2 = pd.DataFrame({'b': [0.2, .5, .4], 'c': [.5, .6, .7], 'd': [1.1, .6, .7]})
color_dict = {'a':'green', 'b': 'red', 'c':'blue', 'd': 'cyan'}
df1.plot.bar(color = color_dict)
df2.plot.bar(color = color_dict)
我认为这可能是一个很好的起点。在将第二个图形作为颜色传递之前,可能会对其颜色列表[1:]进行切片?非常好。为了提高稳健性,您可以创建一个data2color dict(
d2c=dict(zip(数据文件,颜色列表))
),然后在plot命令中输入color=map(d2c.get,df1.columns)
,对于df2也是如此。看起来很有效:)。实际上我更喜欢这个。感觉这应该是一个易于实现的特性请求。我想列表输入对于pandas开发人员来说已经足够定制了,不确定他们还能做什么。而且我在别的地方完全发现了这个小把戏,所以我不能把所有的功劳都归功于它,呵呵!这是一个很好的解决方案。我喜欢字典法的地图。谢谢瑞典人和阿琼!这是可行的,但我必须以倒转的方式{“color”:“column”}来构造它,这很奇怪吗?在我操作数据时,它似乎也会去同步,即使我保持列名不变,它也不起作用,我也不知道为什么。