แผนภูมิแท่งใน matplotlib โดยใช้ colormap

Sep 25 2020

ฉันมี 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 กับแผนภูมิแท่งคืออะไร?

คำตอบ

4 JakeLevi Sep 25 2020 at 17:29

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")

เอาท์พุต:

aprendiz Sep 25 2020 at 17:45

โอเคฉันพบวิธีที่จะทำได้โดยไม่ต้องปรับขนาดค่าของฉัน:

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งาน!