以下代码:
import pandas as pd
import matplotlib.pyplot as plt
data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
df = pd.DataFrame(data,columns=['Fruit','Quantity'])
df.set_index('Fruit', inplace=True)
df.plot.bar(color='gray',rot=0)
plt.show()
给出以下输出:
我想用红色绘制条形表示数量最多的两个水果,即橙色和香蕉。我怎样才能做到这一点?与其给定一个固定的阈值来更改颜色,我不希望其图具有足够的鲁棒性来识别顶部的两个小节。
答案 0 :(得分:2)
也许有一种简单直接的方法,但是我能够提出以下解决方案,该解决方案原则上适用于任何数量的最高n
值。这个想法是:
n
从DataFrame获取顶部的n=2
元素(在下面的示例中为nlargest
)if
语句获取最大索引值,以更改那些值最大的色块(条)的颜色。在这里,我们创建了一个轴实例ax
,以便能够提取色块以设置颜色。import pandas as pd
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
df = pd.DataFrame(data,columns=['Fruit','Quantity'])
df.set_index('Fruit', inplace=True)
df.plot.bar(color='gray',rot=0, ax=ax)
top = df['Quantity'].nlargest(2).keys() # Top 2 values here
for i, tick in enumerate(ax.get_xticklabels()):
if tick.get_text() in top:
ax.patches[i].set_color('r')
plt.show()
答案 1 :(得分:1)
问题在于,熊猫柱状图采用color
参数来逐列应用。在这里,您只有一列。因此,像对彩色条形图进行规范化尝试之类的方法不起作用
pd.DataFrame([12,14]).plot.bar(color=["red", "green"])
一种解决方法是创建对角矩阵而不是单个列,并使用stacked=True
选项对其进行绘制。
df = pd.DataFrame([12,14])
df = pd.DataFrame(np.diag(df[0].values), index=df.index, columns=df.index)
df.plot.bar(color=["red", "green"], stacked=True)
另一个选择是改为使用matplotlib。
df = pd.DataFrame([12,14])
plt.bar(df.index, df[0].values, color=color)
现在问题仍然在于如何创建在以上两种解决方案中的任何一种中使用的颜色列表。给定一个数据框df
,您可以创建一个与框架长度相等的数组,并用默认颜色填充它,然后可以将两个最大值的条目设置为另一种颜色:
color = np.array(["gray"]*len(df))
color[np.argsort(df["Quantity"])[-2:]] = "red"
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
df = pd.DataFrame(data,columns=['Fruit','Quantity'])
df.set_index('Fruit', inplace=True)
color = np.array(["gray"]*len(df))
color[np.argsort(df["Quantity"])[-2:]] = "red"
plt.bar(df.index, df.values, color=color)
plt.show()