具有不同 y 轴的同一可视化中的 2 个线图

Posted

技术标签:

【中文标题】具有不同 y 轴的同一可视化中的 2 个线图【英文标题】:2 line-plots in same visualization with different y-axis 【发布时间】:2021-08-11 02:55:21 【问题描述】:

我很坚持这个。 我正在尝试创建一个具有相同 x 轴刻度(年)但不同 y 轴刻度的折线图 我该怎么做?

我有两个包含此信息的数据集:

test_data1.head()
   latitude longitude   place       year
0   36.087  -106.168    New Mexico  1973
1   33.917  -90.775     Mississippi 1973
2   37.160  -104.594    Colorado    1973
3   37.148  -104.571    Colorado    1973
4   36.500  -100.693    Oklahoma    1974

test_data2.head()
    LAT          LONG       BBLS    Year
0   36.900324   -98.21826   300     1977.0
1   36.896636   -98.17772   1,000   2002.0
2   36.806113   -98.32584   1,000   1988.0
3   36.888589   -98.31853   1,000   1985.0
4   36.892128   -98.19462   2,400   2002.0

对于上下文,test_data1 是指地震,test_data2 是指注入井,BBLS 是生产的桶数。

我想做的是创建一个折线图,显示每年的地震次数,以及从 1980 年以来每年生产的桶数。我想在左侧显示每年的地震次数 (y1) 和右侧每年生产的桶数 (y2)。

这是我所做的,但它不起作用,有人知道为什么或告诉我一种方法吗?

import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
%matplotlib  inline 

x=test_data1['year']
y1 = test_data1['place']
y2 = test_data2['BBLS']

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
curve1 = ax1.plot (x, y1, label='Number of Earthquakes', color='r')
curve2= ax2.plot (x, y2, label='Number of Barrels Produced', color='b')
plt.plot()
plt.show()

我遇到了这个巨大的错误,但由于我是 Python 新手,所以我无法理解:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-109-9e26d5f7e5e2> in <module>
     11 ax2 = ax1.twinx()
     12 curve1 = ax1.plot (x, y1, label='Number of Earthquakes', color='r')
---> 13 curve2= ax2.plot (x, y2, label='Number of Barrels Produced', color='b')
     14 plt.plot()
     15 plt.show()

~\anaconda3\lib\site-packages\matplotlib\axes\_axes.py in plot(self, scalex, scaley, data, *args, **kwargs)
   1741         """
   1742         kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D)
-> 1743         lines = [*self._get_lines(*args, data=data, **kwargs)]
   1744         for line in lines:
   1745             self.add_line(line)

~\anaconda3\lib\site-packages\matplotlib\axes\_base.py in __call__(self, data, *args, **kwargs)
    271                 this += args[0],
    272                 args = args[1:]
--> 273             yield from self._plot_args(this, kwargs)
    274 
    275     def get_next_color(self):

~\anaconda3\lib\site-packages\matplotlib\axes\_base.py in _plot_args(self, tup, kwargs)
    394             self.axes.xaxis.update_units(x)
    395         if self.axes.yaxis is not None:
--> 396             self.axes.yaxis.update_units(y)
    397 
    398         if x.shape[0] != y.shape[0]:

~\anaconda3\lib\site-packages\matplotlib\axis.py in update_units(self, data)
   1461         neednew = self.converter != converter
   1462         self.converter = converter
-> 1463         default = self.converter.default_units(data, self)
   1464         if default is not None and self.units is None:
   1465             self.set_units(default)

~\anaconda3\lib\site-packages\matplotlib\category.py in default_units(data, axis)
    105         # the conversion call stack is default_units -> axis_info -> convert
    106         if axis.units is None:
--> 107             axis.set_units(UnitData(data))
    108         else:
    109             axis.units.update(data)

~\anaconda3\lib\site-packages\matplotlib\category.py in __init__(self, data)
    174         self._counter = itertools.count()
    175         if data is not None:
--> 176             self.update(data)
    177 
    178     @staticmethod

~\anaconda3\lib\site-packages\matplotlib\category.py in update(self, data)
    209         for val in OrderedDict.fromkeys(data):
    210             # OrderedDict just iterates over unique values in data.
--> 211             cbook._check_isinstance((str, bytes), value=val)
    212             if convertible:
    213                 # this will only be called so long as convertible is True.

~\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py in _check_isinstance(_types, **kwargs)
   2244     for k, v in kwargs.items():
   2245         if not isinstance(v, types):
-> 2246             raise TypeError(
   2247                 "!r must be an instance of , not a ".format(
   2248                     k,

TypeError: 'value' must be an instance of str or bytes, not a float

不过,木星产生了一些我不想要的情节,更不用说我在地点方面获得了 y1,但我只想计算一年中的地震次数,我只是觉得使用“地方”会使代码变得计数。 请帮忙。

以下是我正在处理的数据集,以防万一。请注意,它们还有更多列,但我没有使用它们,因为它们与此图形无关。

okQuakes.csv (test_data1) InjectionWells.csv (test_data2)

【问题讨论】:

【参考方案1】:

创建前与sharex分享轴像这样

y2 = test_data2['BBLS'].astype(str)

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1)

curve1 = ax1.plot (x, y1, label='Number of Earthquakes', color='r')
curve2= ax2.plot (x, y2, label='Number of Barrels Produced', color='b')
plt.plot()
plt.show()

【讨论】:

我仍然得到同样的错误 TypeError: 'value' must be an instance of str or bytes, not a float 答案已更新,你应该先转换你的 y2 我认为现在还有其他问题。你知道吗?我现在得到 ValueError: x and y must have same first dimension, but have shapes (13946,) and (11065,)

以上是关于具有不同 y 轴的同一可视化中的 2 个线图的主要内容,如果未能解决你的问题,请参考以下文章

Python 数据可视化教程 绘制精美的双 Y 轴折线图

使用色调和不同比例轴的 Seaborn(时间序列)箱线图

具有对数轴的 JavaFX 折线图没有很好地更新[关闭]

如何在 WPF/XAML 中制作关于 Y 轴的列表的连续 360 度动画

ggplot2按y轴的比例排序分类堆积条

Python使用matplotlib函数subplot可视化多个不同颜色的折线图使用set_major_formatter函数自定义设置y轴数值标签格式为百分比