แผนภูมิแท่งใน matplotlib โดยใช้ colormap
ฉันมี df ที่มีสองคอลัมน์:
- y: ค่าตัวเลขที่แตกต่างกันสำหรับแกน y
- วัน: ชื่อของสี่วันที่แตกต่างกัน (วันจันทร์วันอังคารวันพุธวันพฤหัสบดี)
ฉันยังมี colormap ที่มีสี่สีที่แตกต่างกันซึ่งฉันทำขึ้นเองและเป็นวัตถุ ListedColorMap
ฉันต้องการสร้างแผนภูมิแท่งที่มีสี่หมวดหมู่ (วันในสัปดาห์) ในแกน x และค่าที่สอดคล้องกันในแกน y ในขณะเดียวกันฉันต้องการให้แต่ละแท่งมีสีที่แตกต่างกันโดยใช้ colormap ของฉัน
นี่คือรหัสที่ฉันใช้ในการสร้างแผนภูมิแท่งของฉัน:
def my_barchart(my_df, my_cmap):
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.bar(my_df['days'], my_df['y'], color=my_cmap)
return fig
อย่างไรก็ตามฉันได้รับข้อผิดพลาดต่อไปนี้: "object of type 'ListedColormap' ไม่มี len ()" ดังนั้นดูเหมือนว่าฉันใช้ my_cmap ไม่ถูกต้อง
หากฉันลบสิ่งนั้นออกจากฟังก์ชันและเรียกใช้แผนภูมิแท่งของฉันก็ดูโอเคยกเว้นว่าแท่งทั้งหมดจะมีสีเดียวกัน คำถามของฉันคือ: วิธีที่ถูกต้องในการใช้ Colormap กับแผนภูมิแท่งคืออะไร?
คำตอบ
colorอาร์กิวเมนต์ต้องการทั้งสตริงหรือ RGB [A] ค่า (มันอาจจะเป็นสีเดียวหรือลำดับของสีที่มีหนึ่งสำหรับข้อมูลแต่ละจุดที่คุณกำลังวางแผน) โดยทั่วไปแล้วแผนที่สีจะเรียกได้ว่ามีลอยอยู่ในช่วง [0, 1]
ดังนั้นสิ่งที่คุณต้องทำคือใช้ค่าที่คุณต้องการสำหรับสีของแต่ละแท่งปรับขนาดเป็นช่วง [0, 1] แล้วเรียกmy_cmapด้วยค่าที่ปรับขนาดใหม่เหล่านั้น
ตัวอย่างเช่นคุณต้องการให้สีสอดคล้องกับค่า y (ความสูงของแท่ง) จากนั้นคุณควรแก้ไขโค้ดของคุณในลักษณะนี้ (สมมติว่าคุณได้เรียกใช้import numpy as npก่อนหน้านี้):
def my_barchart(my_df, my_cmap):
rescale = lambda y: (y - np.min(y)) / (np.max(y) - np.min(y))
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.bar(my_df['days'], my_df['y'], color=my_cmap(rescale(my_df['y'])))
return fig
นี่คือตัวอย่างขั้นต่ำที่มีอยู่ในตัวของการใช้colorอาร์กิวเมนต์กับผลลัพธ์จากcmap:
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
my_cmap = plt.get_cmap("viridis")
rescale = lambda y: (y - np.min(y)) / (np.max(y) - np.min(y))
plt.bar(x, y, color=my_cmap(rescale(y)))
plt.savefig("temp")
เอาท์พุต:
โอเคฉันพบวิธีที่จะทำได้โดยไม่ต้องปรับขนาดค่าของฉัน:
def my_barchart(my_df, my_cmap):
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.bar(my_df['days'], my_df['y'], color=my_cmap.colors)
return fig
เพิ่ม.colorsหลังเลิกmy_cmapงาน!