使用 MatPlotLib 绘制梯度面积图

问题描述 投票:0回答:1

我编写了以下脚本,为埃克森美孚和沃尔玛制作带有梯度的面积图。

该图具有从左到右的渐变,相反,我希望渐变在最高收盘值处最暗,在每个条形的底部最亮。

CSV 数据文件位于 URL ..(1) http://salilgangal.com/info/XOM.csv ..(2) http://salilgangal.com/info/WMT.csv

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import pandas as pd

def create_area_plot(xx, yy, gradient_cmap, filename, title, y_offset):
    fig, ax = plt.subplots()
    
    # Create a closed path from the data
    path_data = np.column_stack((xx, yy))
    path_data = np.vstack([path_data, [xx[-1], y_offset], [xx[0], y_offset]])  # Close the path
    path = Path(path_data)
    patch = PathPatch(path, facecolor='none')
    ax.add_patch(patch)

    # Calculate the gradient color values
    color_values = np.linspace(0, 1, len(xx))
    
    # Create a smooth gradient-filled area chart
    for i in range(len(xx) - 1):
        ax.fill_between(xx[i:i+2], [yy[i], yy[i]], [y_offset, y_offset], color=gradient_cmap(color_values[i]))

    # Customize the plot
    ax.set_xlabel('Date')
    ax.set_ylabel('Close')
    ax.set_title(title)
    
    # Format the X-axis labels as 'mm/dd/yyyy'
    ax.set_xticks(xx[::len(xx)//10])  # Adjust the number of ticks for better readability
    ax.set_xticklabels([x.strftime('%m/%d/%Y') for x in pd.to_datetime(xom_dates[::len(xx)//10])], rotation=45, ha="right")
    
    plt.savefig(filename)
    plt.show()
    plt.close()

xom_data = pd.read_csv('XOM.csv')
wmt_data = pd.read_csv('WMT.csv')

xom_data['Date'] = pd.to_datetime(xom_data['Date'])
wmt_data['Date'] = pd.to_datetime(wmt_data['Date'])

xom_dates = xom_data['Date'].dt.strftime('%Y-%m-%d')
wmt_dates = wmt_data['Date'].dt.strftime('%Y-%m-%d')
xom_close_prices = xom_data['Close']
wmt_close_prices = wmt_data['Close']

xx = np.arange(0, xom_dates.size, 1)

yy_xom = xom_close_prices.values
yy_wmt = wmt_close_prices.values

# Define the Y-axis offset as 5% lower than the lowest Close value for each stock
y_offset_xom = min(yy_xom) - 0.05 * (max(yy_xom) - min(yy_xom))
y_offset_wmt = min(yy_wmt) - 0.05 * (max(yy_wmt) - min(yy_wmt))

create_area_plot(xx, yy_xom, plt.cm.Blues, "xom_area_chart.png", "XOM Stock Prices", y_offset_xom)
create_area_plot(xx, yy_wmt, plt.cm.Reds, "wmt_area_chart.png", "WMT Stock Prices", y_offset_wmt)

代码中给出了详细信息

python matplotlib gradient stock
1个回答
0
投票

据我所知,这需要“手动”解决方案,并且没有干净或整洁的方法。从我的头顶上我看到三个选项

  1. 用您的数据创建一个数组(即直方图看起来的样子)并使用
    imshow
    。您可以在此处将颜色值指定为数组的值。
  2. 使用
    matplotlib.patches.Rectangle
    创建不同颜色的矩形并将它们垂直堆叠以重新显示图像。
  3. 使用多色线(
    colorline
    ),其中每条线都是一个条形(您仍然需要计算条形末尾的颜色):https://nbviewer.org/github/dpsanders/matplotlib -examples/blob/master/colorline.ipynb

这些可能性都不是很好,但它们(以某种方式)可以完成工作......

© www.soinside.com 2019 - 2024. All rights reserved.